Вопрос или проблема
Как я могу получить на stdout все команды, которые выполняются в bash-скрипте?
Вывод должен содержать как вывод команд, так и сами команды.
Я нашел
#!/bin/bash -x
но это не совсем то же самое, потому что вместо
mysql -v dbname < dump.sql | grep "CREATE TABLE"
он показывает
+ mysql -v dbname
+ grep 'CREATE TABLE'
Используйте bash -v
.
Вот скрипт:
#!/bin/bash -v
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."
Вот вывод:
#!/bin/bash -v
echo "Hello, World" | sed 's|Hello|Goodbye|'
Goodbye, World
echo "Done."
Done.
К сожалению, нет специального маркера, такого как PS4
, для вывода расширенных команд. Однако вы можете объединить оба метода, чтобы быстро идентифицировать команды:
#!/bin/bash -vx
echo "Hello, World" | sed 's|Hello|Goodbye|'
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
echo "Done."
+ echo Done.
Done.
set -x
— это другой способ сделать это.
$ cat a.sh
#!/bin/bash
set -x
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."
Вывод будет таким:
sh a.sh
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.
set -x
является эквивалентом “echo on”
set +x
является эквивалентом “echo off”
Никто не упомянул set -v
, который отображает строки по мере их чтения:
#!/bin/bash
echo "Hello"
set -v
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."
Вывод будет таким:
Hello
echo "Hello, World" | sed 's|Hello|Goodbye|'
Goodbye, World
echo "Done."
Done.
Ответ или решение
Вопрос, который вы задали, касается вывода всех команд, выполняемых в скрипте на bash, с одновременным отображением их результатов. Это выражение можно эквивалентно интерпретировать как аналог команды "echo on" в среде Linux.
Основные способы отображения команд
1. Использование ключа -x
Если вы хотите, чтобы команды, выполняемые в скрипте, отображались с префиксом, указывающим на их выполнение, вам поможет команда set -x
. Она выводит каждую команду до её исполнения, что удобно для отладки. Пример использования:
#!/bin/bash
set -x
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."
Вывод:
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.
Таким образом, set -x
предоставляет хороший способ увидеть, какие команды выполняются, однако результат каждой команды выводится в строчке ниже.
2. Использование ключа -v
Следующий вариант — это использовать set -v
, что позволяет отображать команды по мере их чтения интерпретатором, без префиксов:
#!/bin/bash
echo "Hello"
set -v
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."
Вывод:
Hello
echo "Hello, World" | sed 's|Hello|Goodbye|'
Goodbye, World
echo "Done."
Done.
В этом случае, команды будут выводиться в их исходной форме перед результатом.
3. Совмещение -x
и -v
Если вы хотите видеть как команды, так и их вывод с четкими метками, можно использовать комбинированный режим, задав оба параметра одновременно:
#!/bin/bash
set -vx
echo "Hello, World" | sed 's|Hello|Goodbye|'
echo "Done."
Вывод:
+ echo 'Hello, World'
+ sed 's|Hello|Goodbye|'
Goodbye, World
+ echo Done.
Done.
Альтернативные способы и заклюение
Кроме того, обратите внимание, что вы можете активировать и деактивировать отображение с помощью set +x
для управления выводом в пределах скрипта.
Таким образом, команды set -x
и set -v
предоставляют вам возможность выбирать между простым выводом команд с префиксами и показом строк до их выполнения. Выбор метода зависит от ваших потребностей в отладке и ясности отображаемой информации.
Если вам необходимо собрать полное понимание о ходе выполнения скрипта, комбинированное использование -x
и -v
будет наилучшим решением.
Для управления выводом вы также можете рассмотреть возможность использования логирования в файл, если вывод консоли становится слишком громоздким для восприятия.