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


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

#!/bin/bash
cd ~/hello
ls

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


74
2018-05-31 13:39


Источник


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


Ответы:


bash -x script

или

set -x

в скрипте.

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


98
2018-05-31 13:44



Я всегда использовал это для большого эффекта. Результат выглядит немного грязнее, чем вы могли бы ожидать. - Scott Pack
Установив PS4 вы можете настроить подсказку -x, Например.: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script (date будет замедлять его, хотя) - Walter Tross


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

set -v

или

#!/bin/bash -v

Но -v не печатает строку PS4 перед каждой строкой сценария и не отслеживает шаги инструкции «для» (например) отдельно. Он выполняет эхо-комментарии, а -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 многословное», но последнее, похоже, не работает как часть shebang.


22
2018-05-31 15:28



Отличное объяснение! без каких-либо исследований, мне кажется, что Verbose и eXplicit - вот что означают эти две буквы. - Ape-inago
Я думаю, что -x ближе к eXecute. - Steven Parkes


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

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

10
2018-05-31 14:18





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

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

5
2018-05-31 13:44





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

Другие советы Вот


4
2018-06-10 12:45





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

#!/usr/bin/env bash -x

как линия shebang.

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

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


3
2018-05-31 19:09





идет как

language -x script

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

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


2
2018-05-31 16:12



-x не имеет ничего общего с эхом в Python - Eugene Pankov


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


0
2018-06-11 11:16