Есть ли лучший способ создать файл в bash, кроме использования touch и echo?

Я создал сценарий bash, который установил некоторые приложения и написал файл .conf. Я хотел, чтобы мой скрипт bash создал файл для меня, чтобы я мог просто запустить файл, и он все это установил. был ли лучший способ сделать это, чем это, или я сделал это наилучшим образом. просто интересно, какие у меня были другие варианты.

Примечание: файл работает

if [ ! -e ~/.conf/file/path ]; then touch ~/.conf/file/path echo " long conf list here ..." >> ~/.conf/file/path fi
4
задан 18 October 2017 в 22:25

9 ответов

Что касается вашего скрипта, вы можете использовать перенаправление > в файл. Вы спрашиваете, существует ли файл (лучше его следует выражать как if ! [ -e ~/.conf/file/path ];), поэтому нет необходимости использовать оператор append в этом конкретном случае (хотя он работает хорошо).

Что касается печати длинной многострочной конфигурации в файл, Panther уже намекнул на использование здесь документов в своем комментарии под ответом Томаса. Это частая техника, которую я лично использую для написания «справочного сообщения» или информации о параметрах в моих сценариях

. Вы можете легко сделать что-то вроде этого:

bash-4.3$ cat > out.txt  <<EOF
> parameter1="value 1"
> parameter2="value 2"
> EOF
bash-4.3$ cat out.txt
parameter1="value 1"
parameter2="value 2"
bash-4.3$ 

Или, альтернативно, создать конкретный функцию write_config(), чтобы сделать ваш скрипт более идиоматичным, так сказать:

#!/usr/bin/env bash
# note usage of $HOME variable instead of ~
my_config="$HOME/my_conf_file.txt"
# declare all functions at the top
config_exists()[[ -e "$my_config" ]]

write_config(){
    cat > "$my_config" <<EOF
parameter1="value 1"
parameter2="varlue 2"
EOF
}

if ! config_exists;
then
    echo "config doesn't exist"
    write_config
fi
2
ответ дан 22 May 2018 в 17:26

Что касается вашего скрипта, вы можете использовать перенаправление > в файл. Вы спрашиваете, существует ли файл (лучше его следует выражать как if ! [ -e ~/.conf/file/path ];), поэтому нет необходимости использовать оператор append в этом конкретном случае (хотя он работает хорошо).

Что касается печати длинной многострочной конфигурации в файл, Panther уже намекнул на использование здесь документов в своем комментарии под ответом Томаса. Это частая техника, которую я лично использую для написания «справочного сообщения» или информации о параметрах в моих сценариях

. Вы можете легко сделать что-то вроде этого:

bash-4.3$ cat > out.txt <<EOF > parameter1="value 1" > parameter2="value 2" > EOF bash-4.3$ cat out.txt parameter1="value 1" parameter2="value 2" bash-4.3$

Или, альтернативно, создать конкретный функцию write_config(), чтобы сделать ваш скрипт более идиоматичным, так сказать:

#!/usr/bin/env bash # note usage of $HOME variable instead of ~ my_config="$HOME/my_conf_file.txt" # declare all functions at the top config_exists()[[ -e "$my_config" ]] write_config(){ cat > "$my_config" <<EOF parameter1="value 1" parameter2="varlue 2" EOF } if ! config_exists; then echo "config doesn't exist" write_config fi
2
ответ дан 18 July 2018 в 05:06

Что касается вашего скрипта, вы можете использовать перенаправление > в файл. Вы спрашиваете, существует ли файл (лучше его следует выражать как if ! [ -e ~/.conf/file/path ];), поэтому нет необходимости использовать оператор append в этом конкретном случае (хотя он работает хорошо).

Что касается печати длинной многострочной конфигурации в файл, Panther уже намекнул на использование здесь документов в своем комментарии под ответом Томаса. Это частая техника, которую я лично использую для написания «справочного сообщения» или информации о параметрах в моих сценариях

. Вы можете легко сделать что-то вроде этого:

bash-4.3$ cat > out.txt <<EOF > parameter1="value 1" > parameter2="value 2" > EOF bash-4.3$ cat out.txt parameter1="value 1" parameter2="value 2" bash-4.3$

Или, альтернативно, создать конкретный функцию write_config(), чтобы сделать ваш скрипт более идиоматичным, так сказать:

#!/usr/bin/env bash # note usage of $HOME variable instead of ~ my_config="$HOME/my_conf_file.txt" # declare all functions at the top config_exists()[[ -e "$my_config" ]] write_config(){ cat > "$my_config" <<EOF parameter1="value 1" parameter2="varlue 2" EOF } if ! config_exists; then echo "config doesn't exist" write_config fi
2
ответ дан 24 July 2018 в 18:14

Просто выполните echo "text" >> /path/to/file, если файл не существует.

Прекрасная вещь о перенаправлении и добавлении текста заключается в том, что если ваш вывод является файловым путем, а файл еще не существует, он создаст файл, независимо от того, используется ли > или >>. Обычно нет файла touch. (Хотя, если вы уверены, что файл не существует, просто используйте > вместо >>; >> следует добавить в файл, но если файл не существует, ну ...)

5
ответ дан 22 May 2018 в 17:26

Если «длинный список сообщений» настолько длинный, что он препятствует читаемости вашего сценария оболочки, почему бы просто не поместить его в отдельный файл, который сопровождает скрипт? Тогда все, что вам нужно сделать в сценарии оболочки, это скопировать этот файл в пункт назначения.

if [ ! -e ~/.conf/file/path ]; then
   cp /path/to/mytemplate ~/.conf/file/path
fi
0
ответ дан 22 May 2018 в 17:26

Просто выполните echo "text" >> /path/to/file, если файл не существует.

Прекрасная вещь о перенаправлении и добавлении текста заключается в том, что если ваш вывод является файловым путем, а файл еще не существует, он создаст файл, независимо от того, используется ли > или >>. Обычно нет файла touch. (Хотя, если вы уверены, что файл не существует, просто используйте > вместо >>; >> следует добавить в файл, но если файл не существует, ну ...)

5
ответ дан 18 July 2018 в 05:06

Если «длинный список сообщений» настолько длинный, что он препятствует читаемости вашего сценария оболочки, почему бы просто не поместить его в отдельный файл, который сопровождает скрипт? Тогда все, что вам нужно сделать в сценарии оболочки, это скопировать этот файл в пункт назначения.

if [ ! -e ~/.conf/file/path ]; then cp /path/to/mytemplate ~/.conf/file/path fi
0
ответ дан 18 July 2018 в 05:06

Просто выполните echo "text" >> /path/to/file, если файл не существует.

Прекрасная вещь о перенаправлении и добавлении текста заключается в том, что если ваш вывод является файловым путем, а файл еще не существует, он создаст файл, независимо от того, используется ли > или >>. Обычно нет файла touch. (Хотя, если вы уверены, что файл не существует, просто используйте > вместо >>; >> следует добавить в файл, но если файл не существует, ну ...)

5
ответ дан 24 July 2018 в 18:14

Если «длинный список сообщений» настолько длинный, что он препятствует читаемости вашего сценария оболочки, почему бы просто не поместить его в отдельный файл, который сопровождает скрипт? Тогда все, что вам нужно сделать в сценарии оболочки, это скопировать этот файл в пункт назначения.

if [ ! -e ~/.conf/file/path ]; then cp /path/to/mytemplate ~/.conf/file/path fi
0
ответ дан 24 July 2018 в 18:14

Другие вопросы по тегам:

Похожие вопросы: