我经常交互循环,例如我的文件并想对所有文件执行特定操作,假设我想重命名所有文件:
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/