Як виконувати скрипт bash рядок за рядком?


93

Якщо я введу опцію bash -x , вона покаже весь рядок. Але сценарій буде виконуватися нормально.

Як я можу виконати рядок за рядком? Тоді я бачу, чи правильно це зробив, або я перериваю та виправляю помилку. Той самий ефект ставиться readв кожному рядку.


1
Можливо , в більш широкому сенсі дивись також stackoverflow.com/questions/951336/how-to-debug-a-bash-script / ...
tripleee

Відповіді:


126

Вам не потрібно поміщати прочитання в кожен рядок, просто додайте пастку, як показано нижче, у ваш скрипт bash, це має ефект, який ви хочете, наприклад.

#!/usr/bin/env bash
set -x
trap read debug

< YOUR CODE HERE >

Працює, просто перевірив його з bash v4.2.8 і v3.2.25.


ПОЛІПШЕННА ВЕРСІЯ

Якщо ваш сценарій читає вміст із файлів, перерахований вище не буде працювати. Обхідний шлях може виглядати наступним прикладом.

#!/usr/bin/env bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG

< YOUR CODE HERE >

Щоб зупинити скрипт, вам доведеться вбити його з іншої оболонки .


АЛЬТЕРНАТИВА1

Якщо ви просто хочете зачекати кілька секунд, перш ніж переходити до наступної команди у вашому сценарії, наступний приклад може працювати для вас.

#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG

< YOUR CODE HERE >

Я додаю set + x та set -x в команді trap, щоб зробити вивід більш читабельним.


1
Тоді як перейти до наступного рядка (виконати наступну команду)?
Девід Дорія,

2
Він фіксує читання кожної команди. Єдине, що вам потрібно зробити, це натиснути return, щоб перейти до наступної команди
organic-mashup

1
якщо у вас є такі командні рядки, як "під час читання рядка; виконайте ехо $ line; done <somefile", цей метод не працює, оскільки "trap read DEBUG" рядок читання з somefile
mug896

3
Як змусити зупинитись? Після того, як я проходжу сценарій до кінця, оболонка діє так, ніби сценарій все ще працює.
slashdottir

1
Перейдіть на, trap 'read -u1' debugщоб замінити проблему перенаправлення читання файлів.
user3132194

23

Можливо, налагоджувач BASH - це щось для вас.


3
Це дійсно найкраще рішення. Це дозволяє переглядати рядок перед його запуском (і багато іншого). У більшості систем його можна встановити apt-get install bashdb. Тоді вам просто потрібно запустити bashdb your_command.sh, набрати step, а потім натиснути на повернення каретки після цього.
studgeek

1
@studgeek недоступний на Redhat / CentOS тощо, тому я б не називав це "більшістю систем".
Саджук

@Sajuuk, можливо, він не упакований , але він абсолютно доступний .
Чарльз Даффі

macOS:brew install bashdb
boweeb

@CharlesDuffy: це теж не в репозиторіях Ubuntu за замовчуванням.
Дан Даскалеску,

2

Якщо ваш скрипт bash насправді являє собою набір одноразових команд, які ви хочете запустити по черзі, ви можете зробити щось подібне, яке запускає кожну команду по черзі при збільшенні змінної LN, що відповідає номеру рядка, який потрібно виконати . Це дозволяє просто просто знову виконати останню команду, а потім просто збільшити змінну, щоб перейти до наступної команди.

Припускаючи, що ваші команди знаходяться у файлі "it.sh", виконайте наступні, одну за одною.

$ cat it.sh
echo "hi there"
date
ls -la /etc/passwd

$ $(LN=1 && cat it.sh | head -n$LN | tail -n1)
"hi there"

$ $(LN=2 && cat it.sh | head -n$LN | tail -n1)
Wed Feb 28 10:58:52 AST 2018

$ $(LN=3 && cat it.sh | head -n$LN | tail -n1)
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd


1

xargs: може фільтрувати рядки

cat .bashrc | xargs -0 -l -d \\n bash
  • -0 Розглядати як вихідну сировину (без виходу)
  • -l Відокремте кожен рядок (не за замовчуванням для вистав)
  • -d \\ n Розділювач рядків
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.