Як змусити bash-скрипти роздрукувати кожну команду до її виконання?


88

Наприклад, у мене простий файл bash

#!/bin/bash
cd ~/hello
ls

Як я можу змусити його відображати кожну команду перед її виконанням? Якраз протилежний ефект "@echo off" у пакетному сценарії Windows.


1
Для тих, хто шукає setваріанти, ви можете знайти їх на цій довільній сторінці .
mkobit

Ви можете просто продовжити #!/bin/bash -x
шебанг так

Відповіді:


110
bash -x script

або

set -x

у сценарії.

Ви можете знову скасувати опцію за допомогою set +x. Якщо ви просто хочете зробити це для декількох команд, ви можете скористатись нижньою оболонкою: `(set -x; command1; command; ...;)


Я завжди використовував це з великим ефектом. Вихід виглядає трохи бруднішим, ніж ви могли спочатку очікувати.
Скотт Пак

2
Встановивши, PS4ви можете налаштувати підказку -x. Напр .: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( dateхоча це сповільнить)
Уолтер Трос

23

Вони також працюють:

set -v

або

#!/bin/bash -v

Але -v не друкує рядок PS4 перед кожним рядком сценарію, і він не відстежує кроки оператора "for" (наприклад) окремо. Це повторює коментарі, а -x - не.

Ось приклад виводу з використанням -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Ось результат того самого сценарію з -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

Зауважте, що я включив "echo -n", щоб додати наголос на відмінності між -v та -x. Крім того, -v те саме, що "-o багатослівний", але останній, здається, не працює як частина шебангу.


Чудове пояснення! не роблячи жодних досліджень, мені здається, що це багатослівні та eXplicit - це те, що означає ці дві літери.
Апе-інаго

Я думаю, -x ближче до eXecute.
Стівен Паркс



4

set -o xtraceі set +o xtraceє вашими друзями (він більш багатослівний, ніж -o verbose, і вихід переходить до STDERR, на відміну від багатослівного, який, здається, увійшов до STDOUT).

Дивіться більше порад тут


3

Є кілька способів.

#!/usr/bin/env bash -x

як лінія шебанга.

Включення set -xв сам сценарій дозволить функціоналу, а одночасно set +xвимкне його. Обидва ці методи також будуть працювати з більш портативною оболонкою sh.

Якщо я правильно пам'ятаю, Perl також має опцію -x.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.