Как выводить команды оболочки по мере их выполнения
Заголовок: Как в shell-скрипте вывести все выполняемые команды с расширением переменных?
Описание проблемы:
В своем shell-скрипте я хочу вывести все команды, которые выполняются, и автоматически расширять любые имена переменных.
Например, у меня есть следующая строка:
ls $DIRNAME
Я хотел бы, чтобы скрипт выполнял команду и выводил следующее:
ls /full/path/to/some/dir
Цель состоит в том, чтобы сохранить журнал всех вызванных shell-команд и их аргументов. Есть ли, возможно, более эффективный способ создания такого журнала?
5 ответ(ов)
set -x
даст вам то, что вы хотите.
Вот пример скрипта на оболочке, чтобы продемонстрировать это:
#!/bin/bash
set -x #включение эха
ls $PWD
Это развернет все переменные и напечатает полные команды перед выводом результата команды.
Вывод будет следующим:
+ ls /home/user/
file1.txt file2.txt
Вы можете использовать функцию для отображения выполняемых команд и их результатов в Bash-скрипте. Пример кода, который вы привели, выполняет эту задачу следующим образом:
#!/bin/bash
# Функция для отображения команд
exe() { echo "\$ $@" ; "$@" ; }
exe echo hello world
В результате выполнения этого скрипта будет следующий вывод:
$ echo hello world
hello world
Если вы хотите обрабатывать более сложные команды с использованием пайпах и так далее, можно использовать eval
. Вот пример, как это сделать:
#!/bin/bash
# Функция для отображения команд
exe() { echo "\$ ${@/eval/}" ; "$@" ; }
exe eval "echo 'Hello, World!' | cut -d ' ' -f1"
Вывод будет таким:
$ echo 'Hello, World!' | cut -d ' ' -f1
Hello
Таким образом, вы можете видеть, что выполняется в вашем сценарии, что может быть полезно для отладки.
Вы можете также включить и отключить отображение команд для отдельных строк в вашем скрипте, обернув их в set -x
и set +x
. Например:
#!/bin/bash
...
if [[ ! -e $OUT_FILE ]]; then
echo "Загружаю $URL"
set -x
curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
set +x
fi
Таким образом, команды, находящиеся между set -x
и set +x
, будут отображаться в выводе, что может быть полезно для отладки.
Вы можете выполнить Bash-скрипт в режиме отладки с помощью опции -x
.
Это позволит вам увидеть все выполняемые команды.
bash -x example_script.sh
# Вывод в консоль
+ cd /home/user
+ mv text.txt mytext.txt
Кроме того, вы можете задавать опцию -x в самом скрипте. Просто укажите опцию -x
в шебанге.
######## example_script.sh ###################
#!/bin/bash -x
cd /home/user
mv text.txt mytext.txt
##############################################
./example_script.sh
# Вывод в консоль
+ cd /home/user
+ mv text.txt mytext.txt
Другой вариант — это добавить -x
в начале вашего скрипта вместо того, чтобы указывать его в командной строке:
$ cat ./server
#!/bin/bash -x
ssh user@server
$ ./server
+ ssh user@server
user@server's password: ^C
$
Таким образом, при запуске скрипта вы получите вывод всех выполняемых команд с префиксом +
, что облегчает отладку.
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как проверить, содержит ли строка подстроку в Bash
Как установить переменную на вывод команды в Bash?
Как объявить и использовать логические переменные в shell-скрипте?
Разница между sh и Bash