bash - 显示命令而不执行它们

标签 bash

我经常交互循环,例如我的文件并想对所有文件执行特定操作,假设我想重命名所有文件:

for file in $(ls); do mv "$file" "${file}_new"; done

这很好用。但是在调用这个命令之前,我想看看它到底做了什么,所以我会在前面加一个echo

for file in $(ls); do echo mv "$file" "${file}_new"; done

然后它会向我显示它会调用的所有命令。如果我对它们感到满意,我会删除 echo 并执行它。

然而,当命令有点微妙时,可能包括管道或多个命令,这就不再起作用了。当然我可以使用 ' 这样特殊字符就不会被解释,但是我没有参数扩展。我也可以转义特殊字符,但这会变得非常乏味。

我的问题是,执行此操作的最佳方法是什么?我在 man bash 中读到关于选项 -n 的内容,它执行“读取命令但不执行它们。这可用于检查 shell 脚本的语法错误. 这会被交互式 shell 忽略。”这正是我所需要的,但我需要它用于交互式 shell。请注意,选项 -x-v 没有帮助,因为它不仅会显示命令,还会调用它,然后可能已经太晚了。

最佳答案

explained by devnull 没有“试运行”选项但有一个简单的解决方法:

debug=
#debug=echo

$debug mv "$file" "${file}_new"

如果您从第二个作业中删除注释(不更改任何其他内容),则为危险的 mv 命令启用“试运行”。

更详细的方法是检查某些条件(如命令行选项):

debug=
if [[ ...enable dry run?... ]]; then
    debug=echo
fi

注意:仅当您启用选项 -u(“替换时将未设置的变量视为错误。”)时才需要空赋值。

重要:当您的命令使用重定向时(因为 shell 将始终在命令启动之前执行重定向),这将无法正常工作。

关于bash - 显示命令而不执行它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19115156/

相关文章:

linux - 如何使用 Bash 中的 file 命令检查文件是否可执行?

linux - 如何使用散列键(#)在 bash 中显示内容?

bash - 符号链接(symbolic link)在创建后立即损坏

svn - 如何检查提交给 SVN 的文件是否使用预提交 Hook 以 UTF-8 编码?

linux - 捕获错误消息并创建日记条目

将 stdout 重定向到 Linux 上的文件时,C++ 程序无法生成输出

java - Shell 命令从 java 失败,但在手动运行时有效

bash - 如何使用 bash 脚本用 tar 备份文件系统?

linux - 从终端短暂运行/重启 sublime text

bash - 如何在单个 ssh 命令中使用 bash $(awk)?