эквивалент “echo on” для linux?

Вопрос или проблема

Как я могу получить на 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 будет наилучшим решением.

Для управления выводом вы также можете рассмотреть возможность использования логирования в файл, если вывод консоли становится слишком громоздким для восприятия.

Оцените материал
Добавить комментарий

Капча загружается...