Как заставить bash-скрипты распечатывать каждую команду перед ее выполнением?

88

Например, у меня есть простой файл Bash

#!/bin/bash
cd ~/hello
ls

Как сделать так, чтобы он отображал каждую команду перед ее выполнением? Как раз противоположный эффект «@echo off» в пакетном сценарии Windows.

эпей
источник
1
Для тех, кто ищет setварианты, вы можете найти их на этой странице руководства .
Mkobit
Вы можете просто расширить Shebang, как это#!/bin/bash -x
sobi3ch

Ответы:

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 verbose, но последний, похоже, не работает как часть шебанга.

Деннис Уильямсон
источник
Отличное объяснение! без каких-либо исследований, мне кажется, что эти две буквы обозначают Verbose и eXplicit.
Апе-инаго
Я думаю -x ближе к eXecute.
Стивен Паркс
10

Это также должно работать:

#!/bin/bash -x
cd ~/hello
ls
Томоэ
источник
6

Это должно работать:

set -o verbose #echo on
...
set +o verbose #echo off
splattne
источник
4

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

Смотрите больше советов здесь

pihentagy
источник
3

Есть несколько способов.

#!/usr/bin/env bash -x

как линия Шебанга.

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

Если я правильно помню, Perl также имеет опцию -x.

user6784
источник
1

идет как

language -x script

language = python, perl, bash -x = оператор script = имя файла

Надеюсь, это поможет.

debuggerpk
источник
3
-xне имеет ничего общего с эхом в Python
Евгений Панков
0

#! /bin/bash -x делает то, что вы хотите.

Рори
источник