В сценарии оболочки, как я повторяю все вызванные команды оболочки и раскрываю имена любых переменных?
Например, с учетом следующей строки:
ls $DIRNAME
Я хотел бы, чтобы скрипт запускал команду и отображал следующее
ls /full/path/to/some/dir
Цель - сохранить журнал всех вызванных команд оболочки и их аргументов. Возможно, есть лучший способ создания такого журнала?
set -x
даст вам то, что вы хотите.Вот пример сценария оболочки для демонстрации:
Это расширяет все переменные и печатает полные команды перед выводом команды.
Вывод:
источник
set -o verbose
илиset -v
(только «многословный») илиset -o xtrace
илиset -x
(только «xtrace») илиset -xv
(оба) илиset -o xtrace -o verbose
(оба).Я использую функцию для вывода и запуска команды:
Какие выводы
Для более сложных командных каналов и т. Д. Вы можете использовать eval:
Какие выводы
источник
++ set +x
выхода при выключении, а также выглядит чище. Однако для одного или двух утверждений ответ bhassel с использованием подоболочки является наиболее удобным.set +x
, это влияет на все команды, что слишком много!cp "foo bar" baz
иcp foo "bar baz"
, например. Так что это хорошо для отображения информации о прогрессе для пользователя; меньше для отладки вывода или записи воспроизводимых команд. Различные варианты использования. Вzsh
, вы можете сохранить цитаты с:q
модификатором:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
из вашей команды. Так что не ожидайте, что он будет работать должным образомexe eval "echo 'eval world'"
!Вы также можете переключать это для выбранных строк в вашем скрипте, оборачивая их
set -x
иset +x
, например,источник
Ответ shuckc на вывод выбранных строк имеет несколько недостатков: в конечном итоге вы
set +x
получаете следующую команду и теряете возможность тестировать код выхода с помощью$?
поскольку он перезаписывается командойset +x
.Другой вариант - запустить команду в подоболочке:
который даст вам вывод, как:
Это, однако, требует дополнительных затрат на создание новой подоболочки для команды.
источник
++ set +x
вывода.if [ $? -eq 0 ]
наif (set -x; COMMAND)
.Другой вариант - поставить «-x» в верхней части скрипта, а не в командной строке:
источник
./myScript
иbash myScript
. Еще хорошо отметить, спасибо.Согласно TLDP «s Guide Bash для начинающих: Глава 2. Разработка и отладка скриптов :
источник
Введите «bash -x» в командной строке перед именем сценария Bash. Например, чтобы выполнить foo.sh, введите:
источник
Вы можете выполнить скрипт Bash в режиме отладки с
-x
опцией .Это будет повторять все команды.
Вы также можете сохранить опцию -x в скрипте . Просто укажите
-x
опцию в шебанге.источник
bash -vx
будет делать то же самое, но без интерполяции переменныхДля зш, эхо
И для отладки,
источник
Для
csh
иtcsh
, вы можетеset verbose
илиset echo
(или вы можете даже установить оба, но это может привести к некоторому дублированию в большинстве случаев).verbose
Опция печатает довольно много точное выражение оболочки , что вы печатаете.echo
Вариант более показателен , что будет выполняться через нерест.http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
источник
Вывод следующий:
источник
Чтобы разрешить вывод сложных команд, я использую функцию
eval
плюс Сотаexe
для вывода и запуска команды. Это полезно для конвейерных команд, которые в противном случае показывали бы только один или только начальную часть конвейерной команды.Без оценки
Выходы:
С eval:
Какие выводы
источник