2011-10-31 55 views
15

Nhà điều hành bash < < < có nghĩa là gì, như bên trong khối mã sau? Và làm thế nào đến $ IFS vẫn là một không gian, không phải là một khoảng thời gian?Toán tử Bash <<< có nghĩa là gì?

LINE="7.6.5.4" 
IFS=. read -a ARRAY <<< "$LINE" 
echo "$IFS" 
echo "${ARRAY[@]}" 
+0

Sử dụng khác của toán tử này (thay vì đặt tên theo đường ống bằng mknod) khi bạn cần nhiều ống trong một đơn | pipline: ví dụ: dữ liệu echo | lệnh --data-on-stdin --other-data-on-fd-3 3 <<< 'dữ liệu khác' – mosh

Trả lời

13

Chuyển hướng chuỗi thành tiêu chuẩn của lệnh.

Biến được gán trực tiếp trước lệnh theo cách này chỉ có hiệu lực đối với quy trình lệnh; vỏ vẫn còn nguyên vẹn.

+0

Làm cách nào để sửa đổi nó để sử dụng dấu phân tách nhiều tùy chỉnh? Nói, '==>'? Làm thế nào tôi nên trích dẫn chuỗi? – gsklee

+1

Bạn không thể. '$ IFS' luôn được hiểu là một chuỗi ký tự đơn. –

7

Từ man 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ó.

. trên dòng IFS tương đương với source trong bash.

Cập nhật: Thêm từ man bash (Cảm ơn gsklee, sehe)

IFS Các nội Dòng tách được sử dụng cho từ tách sau khi mở rộng và để dòng chia thành các từ với đọc BUILTIN lệnh. Giá trị mặc định là "<space><tab><new‐line>".

chưa nhiều từ man bash

Môi trường cho bất kỳ lệnh đơn giản hoặc chức năng có thể được tăng cường tạm thời bằng cách đặt trước nó với nhiệm vụ tham số, như mô tả ở trên trong THÔNG SỐ. Các câu lệnh gán này chỉ ảnh hưởng đến môi trường mà lệnh đó thấy.

+2

'.' có vẻ giống như một cách để xác định dấu phân tách tùy chỉnh cho' $ LINE' – gsklee

+1

http://tldp.org/LDP/abs/html/internalvariables.html # IFSREF – sehe

2

Lý do mà IFS không được thiết lập là bash mà không nhìn thấy đó như là một lệnh riêng biệt ... bạn cần phải đặt một thức ăn đường hoặc một dấu chấm phẩy sau lệnh để chấm dứt nó:

$ cat /tmp/ifs.sh 
LINE="7.6.5.4" 
IFS='.' read -a ARRAY <<< "$LINE" 
echo "$IFS" 
echo "${ARRAY[@]}" 

$ bash /tmp/ifs.sh 


7 6 5 4 

nhưng

$ cat /tmp/ifs.sh 
LINE="7.6.5.4" 
IFS='.'; read -a ARRAY <<< "$LINE" 
echo "$IFS" 
echo "${ARRAY[@]}" 

$ bash /tmp/ifs.sh 
. 
7 6 5 4 

tôi không chắc chắn lý do tại sao làm điều đó một cách đầu tiên không phải là một lỗi cú pháp mặc dù.

+2

Bởi vì cách đầu tiên là làm thế nào bạn tạm thời đặt env vars cho một lệnh duy nhất. Chúng tự động đặt lại về giá trị trước đó của chúng khi lệnh đó hoàn tất. Tôi sử dụng tất cả các thời gian để thiết lập cờ gỡ lỗi hoặc những gì có bạn nhưng chỉ tạm thời. – Tanktalus

+0

Đây là thông tin rất hữu ích, cảm ơn! =) – gsklee