cat отображает содержимое многострочного файла в одну строку - PullRequest
1 голос
/ 21 июня 2019

В сценарии Linux Shell я пытаюсь отследить состояние каждой команды («Успешно» или «Сбой») в файле журнала.

Ниже приведен фрагмент кода для записи записей в файл журнала.

scp $user@$host:$from $to 2>error.txt

command_run_status=$?

if [[ $command_run_status == 0 ]]; then log_message="secure copy on ("${host}") with ("${user}") is successful"; else log_message="error copying files "`cat error.txt`; fi

./logging.sh "$CURRENT_PID" "$log_message" "D"

Файл журнала создается с записью, приведенной ниже:

DEBUG 2019-06-21 10:05:35,347 BST [pid1234] [autouser]: error copying files usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 [...] [[user@]host2:]file2

Однако я ожидаю записи в журнале, как показано ниже - содержимое файла error.txt с символом новой строки.

DEBUG 2019-06-21 10:05:35,347 BST [pid1234] [autouser]: error copying files

usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]

           [-l limit] [-o ssh_option] [-P port] [-S program]

           [[user@]host1:]file1 [...] [[user@]host2:]file2

Содержимое error.txt приведено ниже:

usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]

           [-l limit] [-o ssh_option] [-P port] [-S program]

           [[user@]host1:]file1 [...] [[user@]host2:]file2

Может ли кто-нибудь прокомментировать причину отображения содержимого многострочного файла, отображаемого в одной строке в файле журнала?

Какие изменения необходимы в команде для печати содержимого файла ошибок (с символом новой строки) в файле журнала?

1 Ответ

2 голосов
/ 21 июня 2019
`cat error.txt`

Bash выполняет расширение, выполняя команду в среде подоболочек и заменяя подстановку команды стандартным выводом команды, удаляя все завершающие символы новой строки. Введенные новые строки не удаляются, , но они могут быть удалены во время разделения слов .

Чтобы предотвратить разбиение слов, включите подстановку команд в двойные кавычки.

echo $(printf 'a\nb\nc')

печать

a b c

, а

echo "$(printf 'a\nb\nc')"

печать

a
b
c

(предпочитаю $ (command) старому стилю `command`).

...