Например, у меня есть простой файл на bash
#!/bin/bash
cd ~/hello
ls
Как я могу заставить его отображать каждую команду перед ее выполнением? Прямо противоположный эффект от "@echo off" в пакетном сценарии Windows.
bash -x script
или
set -x
в сценарии.
Вы можете снова отключить эту опцию с помощью set +x
. Если вы просто хотите сделать это для нескольких команд, вы можете использовать подоболочку: `(set -x; command1; command; ...;)
Они также работают:
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», но последнее, похоже, не работает как часть shebang.
Это также должно работать:
#!/bin/bash -x
cd ~/hello
ls
Это должно работать:
set -o verbose #echo on
...
set +o verbose #echo off
set -o xtrace
и set +o xtrace
ваши друзья (это более многословно, чем -o verbose
, и вывод идет в STDERR, а не в подробный, который, кажется, записывается в STDOUT).
Посмотреть больше советов Вот
Есть несколько способов.
#!/usr/bin/env bash -x
как линия шебанг.
Включая set -x
в самом скрипте включит функциональность, пока set +x
отключит его. Оба эти метода также будут работать с более переносимой оболочкой sh.
Если я правильно помню, Perl также имеет параметр -x.
идет как
language -x script
язык = python, perl, bash -x = оператор script = имя файла
Надеюсь, поможет.
#! /bin/bash -x
делает что хотите.