Как создать файл с несколькими строками из командной строки?

Как я могу ввести следующее содержимое в файл:

Hi abcd 

Я попытался использовать echo "Hi\nabcd" >> ab.txt , но в файле он написан как есть ( \n включен, вместо новой строки)

Вы должны сказать echo чтобы почтить escape-последовательности.

 echo -e "Hi\nabcd" >> ab.txt 

Поведение echo варьируется от оболочки до оболочки 1; Поведение printf более стандартное.

 printf "Hi\nabcd" >> ab.txt 

¹ «Невозможно использовать эхо- портабельность во всех системах POSIX, если оба -n (как первый аргумент) и escape-последовательности не указаны».

Вы также можете просто сделать cat > file , затем набрать и нажать Ctrl-D, когда закончите.

Вы также можете играть в игры со ссылкой:

  % echo 'Hi > abcd' >> ab.txt 

Вы вводите это в bash, нажимая «Enter» после «Hi». Bash использует '>' в качестве приглашения на ее продолжение для меня. По какой-то причине я не мог избежать индивидуального возвращения с обратной косой чертой.

Я бы предложил использовать функцию оболочки bash под названием Here Document . Похоже, самая элегантная форма для достижения того, что вы описываете. Самое главное, многострочный контент выглядит точно так же, как и в выходном файле (в отличие от нечитабельных, длинных, \n разделенных строк).

 cat > ab.txt <<EOL Hi abcd EOL 

EOL здесь – это маркер, который сообщает, какую оболочку следует искать, чтобы найти конец документа здесь . Вы можете произвольно выбрать слово, которое позволит вам выбрать то, что не будет совпадало бы с самим содержимым этого документа . Приятно, что у вас может быть оболочка ${VARIABLES} которая будет заменена. Если это как-то нежелательно, вы всегда можете обернуть открывающее (только открывающее!) Маркерное слово кавычками ( ' ), чтобы предотвратить его.

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

 cat > ~/.screenrc <<END_OF_HEREDOC_MARKER defscrollback ${MAX_LINES} END_OF_HEREDOC_MARKER 
 cp /dev/tty file 

нажмите Ввод. затем начните вводить текст. продолжайте печатать столько, сколько захотите. когда вы заполнили всю информацию, введите строку tty EOT. это обычно отправляется с помощью CTRL+D теперь, возможно, нажмите его еще раз. все готово.