Як я можу написати тут документ у файл у сценарії 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