2010-08-13 38 views
10

Tôi đang cố chuyển một chuỗi có chứa một dòng mới vào một tập lệnh PHP qua BASH.Chuỗi ống với dòng mới để lệnh trong bash?

#!/bin/bash 

REPOS="$1" 
REV="$2" 

message=$(svnlook log $REPOS -r $REV) 
changed=$(svnlook changed $REPOS -r $REV) 

/usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php <<< "${message}\n${changed}" 

Khi tôi làm điều này, tôi thấy chữ "\ n" chứ không phải là newline thoát:

blah blah issue 0000002.\nU app/controllers/application_controller.rb 

Bất kỳ ý tưởng làm thế nào để dịch '\ n' để một dòng mới theo nghĩa đen?

Nhân tiện: < < < làm gì trong bash? Tôi biết < đường chuyền trong một tập tin ...

Trả lời

17

thử

echo -e "${message}\n${changed}" | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php 

nơi -e cho phép giải thích các dấu chéo ngược thoát (theo man echo)

Lưu ý rằng điều này cũng sẽ giải thích dấu chéo ngược thoát mà bạn có khả năng có trong ${message} và trong ${changed}.


Từ hướng dẫn bash: Đây Strings

Một biến thể của ở đây các tài liệu, định dạng là:

<<<word 

Từ này sẽ được mở rộng và cung cấp cho các lệnh trên đầu vào tiêu chuẩn của nó.

Vì vậy, tôi muốn nói

the_cmd <<< word 

tương đương với

echo word | the_cmd 
+0

Tuyệt vời! Nó thực sự-hơn là -a, nhưng đó là chính xác những gì tôi đang tìm kiếm. –

+0

vâng, bạn nói đúng, tôi đã suy nghĩ-nhưng gõ -a ... Tôi sẽ sửa nó. –

+0

'the_cmd <<< word' không * khá * tương đương với 'echo word | the_cmd': '<<<' dường như có khả năng xử lý các chuỗi dài hơn. –

3
newline=$'\n' 
... <<< "${message}${newline}${changed}" 

Các <<< được gọi là một "ở đây chuỗi". Đây là phiên bản một dòng của "tài liệu ở đây" không yêu cầu dấu phân cách như "EOF". Đây là một phiên bản tài liệu ở đây:

... <<EOF 
${message}${newline}${changed} 
EOF 
1

để tránh giải thích trình tự thoát tiềm năng trong ${message}${changed}, hãy thử concatenating chuỗi trong một subshell (một dòng mới được nối sau mỗi echo trừ khi bạn chỉ định các tùy chọn -n) :

(echo "${message}" ; echo "${changed}") | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php 

Dấu ngoặc đơn thực thi lệnh trong một vỏ con (nếu không có dấu ngoặc đơn, chỉ đầu ra của tiếng vọng thứ hai sẽ được đưa vào chương trình php của bạn).

+0

"Để tránh ..." - điều đó sẽ được thực hiện nếu bạn sử dụng 'echo -e' –

Các vấn đề liên quan