Echo некоторые командные строки в оболочке script (echo on для одной команды)
В сценариях оболочки я хотел бы повторить некоторые из основных (длинных) команд для определения статуса и отладки. Я знаю, что могу включить эхо для всех команд с set -x
или set -v
. Но я не хочу видеть все команды (особенно не команды эха). Есть ли способ включить эхо только для одной команды?
Я мог бы сделать так, но это уродливое и повторяет линию set +x
:
#!/bin/sh
dir=/tmp
echo List $dir
set -x
ls $dir
set +x
echo Done!
Есть ли лучший способ сделать это?
Ответы
Ответ 1
Стоимость процесса за раз, вы можете использовать:
(set -x; ls $dir)
Выполняет команду в под-оболочке, поэтому set -x
влияет только на то, что находится внутри круглых скобок. Вам не нужно вводить код или видеть set +x
. Я использую это, когда мне нужно делать выборочную трассировку.
Ответ 2
Как использовать эту функцию?
runtraced() {
echo "[email protected]"
"[email protected]"
}
dosomething
runtraced dosomethingelse
Ответ 3
На основании ответа Джонатана Леффлера это работает точно так же, немного более ясно, потому что после команды нужно отметить. Но вам нужно указать, какую оболочку следует использовать. Это пример для sh:
sh -xc ls $dir
Ответ 4
Легкий способ сделать это с помощью heredoc
и неинтерпретируемой строки. Это POSIX портативный и быстрый:
...
% cmd='ls ${dir}'
% sh -x <<_EOF_
> ${cmd}
> _EOF_
...
Вы можете создавать целые сценарии таким образом, анализируя и/или изменяя их программно по мере необходимости, сохраняя их и вызывая их из переменных оболочки и запуская их все изнутри другой функции script или оболочки:
...
% script="$(cat </some/entire/script.sh)"
% script="$(pipeline | processing | on | ${script})"
% sh -x <<_EOF_ 2>&1 | grep ${specific_cmds_Im_looking_for}
> ${script}
> _EOF_
<desired output>
В моем ответе POSIX-совместимый способ увидеть, определена ли функция в sh script. Я описываю хау и все это более подробно. И в Stack Exchange я довольно подробно обсужу, как heredoc
можно использовать для решения некоторых раздражающих проблем цитирования в ответ на Есть ли способ получить фактические (неинтерпретированные) аргументы оболочки в функции или script?.
-Mike