13

Как выводить команды оболочки по мере их выполнения

15

Заголовок: Как в shell-скрипте вывести все выполняемые команды с расширением переменных?

Описание проблемы:

В своем shell-скрипте я хочу вывести все команды, которые выполняются, и автоматически расширять любые имена переменных.

Например, у меня есть следующая строка:

ls $DIRNAME

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

ls /full/path/to/some/dir

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

5 ответ(ов)

4

set -x даст вам то, что вы хотите.

Вот пример скрипта на оболочке, чтобы продемонстрировать это:

#!/bin/bash
set -x #включение эха

ls $PWD

Это развернет все переменные и напечатает полные команды перед выводом результата команды.

Вывод будет следующим:

+ ls /home/user/
file1.txt file2.txt
1

Вы можете использовать функцию для отображения выполняемых команд и их результатов в 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

Таким образом, вы можете видеть, что выполняется в вашем сценарии, что может быть полезно для отладки.

1

Вы можете также включить и отключить отображение команд для отдельных строк в вашем скрипте, обернув их в 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, будут отображаться в выводе, что может быть полезно для отладки.

0

Вы можете выполнить 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
0

Другой вариант — это добавить -x в начале вашего скрипта вместо того, чтобы указывать его в командной строке:

$ cat ./server
#!/bin/bash -x
ssh user@server

$ ./server
+ ssh user@server
user@server's password: ^C
$

Таким образом, при запуске скрипта вы получите вывод всех выполняемых команд с префиксом +, что облегчает отладку.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь