Как отобразить команды оболочки при их выполнении - PullRequest
740 голосов
/ 18 мая 2010

Как в сценарии оболочки отобразить все вызванные команды оболочки и развернуть имена любых переменных?

Например, с учетом следующей строки:

ls $DIRNAME

Я бы хотел, чтобы скрипт запускал команду и отображал следующее

ls /full/path/to/some/dir

Цель - сохранить журнал всех вызванных команд оболочки и их аргументов. Возможно, есть лучший способ создания такого журнала?

Ответы [ 14 ]

3 голосов
/ 20 августа 2013

для зш эхо

 setopt VERBOSE

и для отладки

 setopt XTRACE
2 голосов
/ 30 июня 2014

Для 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.

1 голос
/ 10 февраля 2016
$ cat exampleScript.sh
#!/bin/bash
name="karthik";
echo $name;

bash -x exampleScript.sh

Вывод выглядит следующим образом:

enter image description here

1 голос
/ 27 января 2015

Чтобы разрешить отображение составных команд, я использую eval плюс функцию exe Soth для вывода, а затем запускаю команду.Это полезно для переданных по конвейеру команд, которые в противном случае отображали бы только одну или только начальную часть переданной по команде команды.

Без eval:

exe() { echo "\$ $@" ; "$@" ; }
exe ls -F | grep *.txt

Выходы:

$
file.txt

С eval:

exe() { echo "\$ $@" ; "$@" ; }
exe eval 'ls -F | grep *.txt'

Какие выходы

$ exe eval 'ls -F | grep *.txt'
file.txt
...