Làm thế nào để hiểu mèo Mèo> file_name << lệnh blah.


13

Trong lệnh sau, cat lấy nội dung của here-doc và chuyển hướng nó đến file có tên conf:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

Làm thế nào để hiểu thứ tự của các lệnh ở đây? Liệu bashquá trình đầu tiên mọi thứ khác (ở đây-doc phần) và như là một bước cuối cùng nó trông giống > confmột phần?

Câu trả lời:


17

Here-Document là một loại chuyển hướng vỏ, vì vậy shell sẽ thực hiện nó như chuyển hướng bình thường, từ đầu đến cuối (hoặc từ trái sang phải hoặc thứ tự xuất hiện). Điều này được xác định bởi POSIX:

Nếu có nhiều hơn một toán tử chuyển hướng được chỉ định bằng một lệnh, thứ tự đánh giá là từ đầu đến cuối.


Trong lệnh của bạn, catsẽ thực hiện > confđầu tiên, mở và cắt conftệp để ghi, sau đó đọc dữ liệu từ đó Here-Document.

Sử dụng strace, bạn có thể xác minh nó:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

Tôi hiểu rồi. Vì vậy, về cơ bản những gì xảy ra trong trường hợp cat > file_name << blahđược rằng trước khi thực hiện catcác thiết bị xuất chuẩn của vỏ được kết nối với file có tên file_namevà sau đó stdin vỏ được kết nối với ở đây-doc ?
Martin

@Martin: Vâng. Bạn có thể thấy openđã được gọi trước đây dup2.
cuonglm

12

Vâng, chúng ta hãy tìm hiểu:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

Đăng. Tôi đoán nó phải được thực hiện >"$file"phần đầu tiên sau đó. Nhưng nếu ...?

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

... không có lỗi ...?

cat ./myfile

this is in ./myfile

Khi nó xuất hiện, vấn đề đặt hàng.


-1

Khi bashtạo quy trình để chạy cat, nó sẽ mở confđể ghi trên bộ mô tả tệp 1 và mở một tệp tạm thời (cho tài liệu ở đây) để đọc trên bộ mô tả tệp 0, trước khi execvào chương trình. Trong trường hợp này, việc những hành động đó xảy ra không quan trọng.

Thứ tự trở nên quan trọng khi các mô tả tập tin được gán lại, ví dụ với 2>&1.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.