Làm thế nào tôi có thể viết một tài liệu ở đây vào một tệp trong tập lệnh Bash?
Làm thế nào tôi có thể viết một tài liệu ở đây vào một tệp trong tập lệnh Bash?
Câu trả lời:
Đọc Hướng dẫn Bash-Scripting nâng cao Chương 19. Tại đây Tài liệu .
Đây là một ví dụ sẽ ghi nội dung vào một tệp tại /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Lưu ý rằng 'EOF' (The LimitString
) cuối cùng không được có bất kỳ khoảng trắng nào trước từ này, vì điều đó có nghĩa làLimitString
chí sẽ không được nhận ra.
Trong tập lệnh shell, bạn có thể muốn sử dụng thụt lề để làm cho mã có thể đọc được, tuy nhiên điều này có thể có tác dụng không mong muốn khi thụt văn bản trong tài liệu của bạn ở đây. Trong trường hợp này, sử dụng <<-
(theo dấu gạch ngang) để tắt các tab hàng đầu ( Lưu ý rằng để kiểm tra điều này, bạn sẽ cần thay thế khoảng trắng hàng đầu bằng một ký tự tab , vì tôi không thể in các ký tự tab thực tế ở đây.)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Nếu bạn không muốn diễn giải các biến trong văn bản, thì hãy sử dụng dấu ngoặc đơn:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Để dẫn ống thông qua một đường ống chỉ huy:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
Đầu ra:
foo
bbr
bbz
... hoặc để viết di truyền vào một tệp bằng cách sử dụng sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
<<<
, chúng được gọi là gì?
<<<
được gọi là 'Đây String'. Mã như tr a-z A-Z <<< 'one two three'
sẽ dẫn đến chuỗi ONE TWO THREE
. Thêm thông tin tại en.wikipedia.org/wiki/Here_document#Here_strings
<<'EOF'
thay vì <<EOF
.
Thay vì sử dụng cat
và chuyển hướng I / O, có thể hữu ích khi sử dụng tee
thay thế:
tee newfile <<EOF
line 1
line 2
line 3
EOF
Nó ngắn gọn hơn, cộng với không giống như toán tử chuyển hướng, nó có thể được kết hợp với sudo
nếu bạn cần ghi vào các tệp có quyền root.
> /dev/null
vào cuối dòng đầu tiên để ngăn nội dung của tệp ở đây được hiển thị thành thiết bị xuất chuẩn khi nó được tạo.
sudo
, hơn là vì tính ngắn gọn của nó :-)
man tee
. Sử dụng -a
cờ để chắp thêm thay vì ghi đè.
Ghi chú:
Câu hỏi (làm thế nào để viết một tài liệu ở đây (còn gọi là heredoc ) vào một tệp trong tập lệnh bash?) Có (ít nhất) 3 kích thước hoặc câu hỏi độc lập chính:
root
:) sở hữu tệp?. thiêng liêng về EOF
, chỉ cần đảm bảo rằng chuỗi bạn sử dụng làm định danh phân định của bạn không xảy ra bên trong di sản của bạn:
Để ghi đè lên một tệp hiện có (hoặc ghi vào một tệp mới) mà bạn sở hữu, thay thế các tham chiếu biến trong heredoc:
cat << EOF > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
EOF
Để nối thêm một tệp hiện có (hoặc ghi vào một tệp mới) mà bạn sở hữu, thay thế các tham chiếu biến trong heredoc:
cat << FOE >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
FOE
Để ghi đè một tệp hiện có (hoặc ghi vào một tệp mới) mà bạn sở hữu, với nội dung bằng chữ của di truyền:
cat << 'END_OF_FILE' > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
END_OF_FILE
Để nối thêm một tệp hiện có (hoặc ghi vào một tệp mới) mà bạn sở hữu, với nội dung theo nghĩa đen của di truyền:
cat << 'eof' >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
eof
Để ghi đè một tệp hiện có (hoặc ghi vào một tệp mới) thuộc sở hữu của root, thay thế các tham chiếu biến trong heredoc:
cat << until_it_ends | sudo tee /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
until_it_ends
Để nối thêm một tệp hiện có (hoặc ghi vào một tệp mới) thuộc sở hữu của user = foo, với nội dung bằng chữ của heredoc:
cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
Screw_you_Foo
-a
== --append
; tức là tee -a
-> tee
. Xem info tee
(Tôi sẽ trích dẫn ở đây, nhưng đánh dấu nhận xét quá hạn chế.
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
thay vì EOF
trong ví dụ bổ sung?
Để xây dựng câu trả lời của @ Livven , đây là một số kết hợp hữu ích.
thay thế biến, tab hàng đầu được giữ lại, ghi đè tập tin, echo vào thiết bị xuất chuẩn
tee /path/to/file <<EOF
${variable}
EOF
không thay thế biến , giữ lại tab hàng đầu, ghi đè tệp, echo vào thiết bị xuất chuẩn
tee /path/to/file <<'EOF'
${variable}
EOF
thay thế biến, tab hàng đầu bị xóa , ghi đè tập tin, echo vào thiết bị xuất chuẩn
tee /path/to/file <<-EOF
${variable}
EOF
thay thế biến, tab hàng đầu được giữ lại, nối vào tệp , echo vào stdout
tee -a /path/to/file <<EOF
${variable}
EOF
thay thế biến, tab hàng đầu được giữ lại, ghi đè tập tin, không có tiếng vang đến thiết bị xuất chuẩn
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
ở trên có thể được kết hợp với sudo
là tốt
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Khi quyền gốc được yêu cầu cho tệp đích, hãy sử dụng |sudo tee
thay vì >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Đối với những người trong tương lai có thể có vấn đề này, định dạng sau đã hoạt động:
(cat <<- _EOF_
LogFile /var/log/clamd.log
LogTime yes
DatabaseDirectory /var/lib/clamav
LocalSocket /tmp/clamd.socket
TCPAddr 127.0.0.1
SelfCheck 1020
ScanPDF yes
_EOF_
) > /etc/clamd.conf
cat << END > afile
tiếp theo là di truyền hoạt động hoàn toàn tốt.
cat
câu trả lời được chấp nhận.
cat
chạy bên trong một lớp con và tất cả đầu ra của lớp con được chuyển hướng đến tệp
Ví dụ, bạn có thể sử dụng nó:
Đầu tiên (tạo kết nối ssh):
while read pass port user ip files directs; do
sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
done <<____HERE
PASS PORT USER IP FILES DIRECTS
. . . . . .
. . . . . .
. . . . . .
PASS PORT USER IP FILES DIRECTS
____HERE
Thứ hai (thực thi lệnh):
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE
Thứ ba (thực thi lệnh):
Script=$'
#Your commands
'
while read pass port user ip; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"
done <<___HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
___HERE
Forth (sử dụng biến):
while read pass port user ip fileoutput; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
#Your command > $fileinput
#Your command > $fileinput
ENDSSH1
done <<____HERE
PASS PORT USER IP FILE-OUTPUT
. . . . .
. . . . .
. . . . .
PASS PORT USER IP FILE-OUTPUT
____HERE