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

<p>например, у меня есть простой файл bash</p><pre><code>#!/bin/bash cd ~/hello ls </code></pre><p>как я могу заставить его отображать каждую команду перед ее выполнением? как раз противоположный эффект "@echo off" в пакетном сценарии windows.</p>

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

<p>они также работают:</p><pre><code>set -v </code></pre><p>или</p><pre><code>#!/bin/bash -v </code></pre><p>но -v не печатает строку ps4 перед каждой строкой сценария и не отслеживает шаги оператора "for" (например) по отдельности. он выводит комментарии, а -x - нет.</p><p>вот пример вывода с использованием -v:</p><pre><code>#!/bin/bash -v # this is a comment for i in {1..4} do echo -n $i done 1234echo echo hello hello </code></pre><p>вот результат того же сценария с -x:</p><pre><code>+ 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 </code></pre><p>обратите внимание, что я добавил "echo -n", чтобы подчеркнуть различия между -v и -x. кроме того, -v - это то же самое, что и -o verbose, но последний, похоже, не работает как часть шебанга.</p>

<p>это также должно работать:</p><pre><code>#!/bin/bash -x cd ~/hello ls </code></pre>

<p>это должно работать:</p><pre><code>set -o verbose #echo on ... set +o verbose #echo off </code></pre>

<p><code>set -o xtrace</code> а также <code>set +o xtrace</code> ваши друзья (это более многословно, чем <code>-o verbose</code>, и выходные данные отправляются в stderr, а не в подробный, который, по-видимому, записывает в stdout).</p><p>смотрите другие советы <a href="http://tldp.org/ldp/bash-beginners-guide/html/sect\_02\_03.html">здесь</a> </p>

<p>есть несколько способов.</p><pre><code>#!/usr/bin/env bash -x </code></pre><p>как линия шебанга.</p><p>включая <code>set -x</code> в самом скрипте включит функциональность, а <code>set +x</code> отключит его. оба эти метода также будут работать с более переносимым sh shell.</p><p>если я правильно помню, perl также имеет опцию -x.</p>

<p>идет как</p><pre><code>language -x script </code></pre><p>language = python, perl, bash -x = оператор script = имя файла</p><p>надеюсь, поможет.</p>

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