Як я можу написати тут документ у файл у сценарії Bash?
Як я можу написати тут документ у файл у сценарії Bash?
Відповіді:
Прочитайте Розширений посібник із написання сценаріїв Розділ 19. Тут Документи .
Ось приклад, який запише вміст у файл на /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
Зауважте, що підсумковий "EOF" (The LimitString
) не повинен мати жодного пробілу перед словом, оскільки це означає, що LimitString
заповіт не буде розпізнаний.
У скрипті оболонки ви можете використовувати відступ, щоб зробити код читабельним, однак це може мати небажаний ефект відступу тексту у вашому тут документі. У цьому випадку використовуйте <<-
(з подальшим тире) для відключення провідних вкладок ( Зверніть увагу, що для перевірки цього вам потрібно буде замінити провідний пробіл символом вкладки , оскільки я не можу надрукувати тут фактичні символи вкладки.)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
Якщо ви не хочете інтерпретувати змінні в тексті, використовуйте одиничні лапки:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
Щоб передати гередок через командний конвеєр:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
Вихід:
foo
bbr
bbz
... або записати гередок у файл, використовуючи sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
<<<
що, як вони називаються?
<<<
називаються "Тут рядки". Код подібний tr a-z A-Z <<< 'one two three'
призведе до рядка ONE TWO THREE
. Більше інформації на en.wikipedia.org/wiki/Here_document#Here_strings
<<'EOF'
а не <<EOF
.
Замість використання cat
та переадресації вводу / виводу може бути корисним tee
замість цього:
tee newfile <<EOF
line 1
line 2
line 3
EOF
Це більш стисло, плюс на відміну від оператора переадресації, його можна комбінувати, sudo
якщо вам потрібно записувати у файли з кореневими правами.
> /dev/null
в кінці першого рядка, щоб запобігти відображенню вмісту файлу тут, щоб stdout, коли він створений.
sudo
, а не через його стислість :-)
man tee
. Використовуйте -a
прапор для додавання замість перезапису.
Примітка:
Питання (як написати тут документ (він же heredoc ) у файл у баш-скрипті?) Містить (принаймні) 3 основні незалежні розміри або підзаписи:
root
власник або інший користувач (наприклад, ) володіє файлом?(Є й інші параметри / підпункти, які я не вважаю важливими. Розгляньте можливість редагування цієї відповіді, щоб додати їх!) Ось кілька важливіших комбінацій розмірів цього питання, перелічених вище, з різними ідентифікаторами, що розмежовують - нічого немає священо EOF
, просто переконайтеся, що рядок, який ви використовуєте як свій обмежувальний ідентифікатор, не зустрічається всередині вашого heredoc:
Щоб перезаписати існуючий файл (або записати у новий файл), який ви є власником, замінивши посилання змінних всередині 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
Щоб додати наявний файл (або записати в новий файл), який ви є власником, замінюючи посилання змінних всередині 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
Щоб перезаписати наявний файл (або записати в новий файл), який ви є власником, з буквальним вмістом гередока:
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
Щоб додати наявний файл (або записати в новий файл), який є у вас, з буквальним вмістом гередока:
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
Щоб перезаписати існуючий файл (або записати в новий файл), що належить root, замінивши посилання змінних всередині 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
Щоб додати існуючий файл (або записати в новий файл), що належить користувачеві = foo, з буквальним вмістом гередока:
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
; тобто, tee -a
-> tee
. Дивіться info tee
(я б це процитував тут, але розмітка коментарів занадто обмежена.
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
замість EOF
прикладу, що додається?
Для того, щоб побудувати на @ Livven в відповідь , ось деякі корисні комбінації.
заміна змінної, збережена ведуча вкладка, перезапис файлу, відлуння до stdout
tee /path/to/file <<EOF
${variable}
EOF
відсутність заміни змінної , збережена ведуча вкладка, перезапис файлу, відлуння до stdout
tee /path/to/file <<'EOF'
${variable}
EOF
заміна змінної, ведуча вкладка видалена , перезапис файлу, відлуння до stdout
tee /path/to/file <<-EOF
${variable}
EOF
заміна змінної, ведуча вкладка збережена, додавання до файлу , відлуння до stdout
tee -a /path/to/file <<EOF
${variable}
EOF
заміна змінної, збережена ведуча вкладка, перезаписування файлу, відсутність відлуння до stdout
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
вище , можуть бути об'єднані з , sudo
а також
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
Коли для |sudo tee
кореспондентського файлу потрібні права доступу, використовуйте замість >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
Для майбутніх людей, які можуть мати цю проблему, працював наступний формат:
(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
слідом за ним гередок працює чудово.
cat
як показано у прийнятій відповіді.
cat
пробіг знаходиться в підзаголовці, а весь вихід
Як екземпляр ви можете використовувати його:
Спочатку (встановлення 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
Друге (виконання команд):
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
Третє (виконання команд):
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
Далі (з використанням змінних):
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