如何逐行执行bash脚本?


Answers:


125

您无需在每一行中都进行读取,只需在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 >

要停止脚本,在这种情况下,您必须从另一个shell杀死它


替代方案1

如果您只想等待几秒钟,然后再继续执行脚本中的下一个命令,则以下示例可能对您有用。

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

< YOUR CODE HERE >

我在trap命令中添加了set + x和set -x,以使输出更具可读性。


1
然后,如何转到下一行(运行下一条命令)?
David Doria 2014年

2
它捕获对每个命令的读取。您唯一需要做的就是按回车键以转到下一个命令
Organic-mashup

1
如果您有这样的命令行“ while read line; do echo $ line; done <somefile”,则该方法将不起作用,因为“ trap read DEBUG”从somefile中读取了命令行
mug896 2015年

3
您如何使其停止?在逐步执行完脚本之后,shell的行为就像脚本仍在运行。
slashdottir

1
更改为trap 'read -u1' debug以覆盖文件读取重定向问题。
user3132194

23

也许BASH调试器适合您。


3
这确实是最好的解决方案。它允许在运行之前查看行(以及更多)。在大多数系统上,可以使用进行安装apt-get install bashdb。然后,您只需要运行bashdb your_command.sh,键入step,然后在那之后按回车键即可。
studgeek '17

1
@studgeek在Redhat / CentOS等上不可用。因此,我不会将其称为“大多数系统”。
Sajuuk

@Sajuuk,它可能没有包装,但绝对可用
查尔斯·达菲

macOS:brew install bashdb
boweeb

@CharlesDuffy:它也不在默认的Ubuntu仓库中。
Dan Dascalescu

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行分隔符
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.