it-swarm-ru.tech

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

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

#!/bin/bash
cd ~/hello
ls

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

90
Epeius
bash -x script

или

set -x

в сценарии.

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

114
Steven Parkes

Они также работают:

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

23

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

#!/bin/bash -x
cd ~/hello
ls
10
tomoe

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

set -o verbose #echo on
...
set +o verbose #echo off
7
splattne

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

Смотрите другие советы здесь

4
pihentagy

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

#!/usr/bin/env bash -x

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

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

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

3
user6784

идет как

language -x script

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

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

1
debuggerpk

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

0
Rory