我set -x在终端输入。
现在终端继续打印在我的输出顶部运行的最后一个命令,因此命令
~]$echo "this is what I see"
Run Code Online (Sandbox Code Playgroud)
返回
+ echo 'this is what I see'
this is what I see
Run Code Online (Sandbox Code Playgroud)
没有手册页set,我该如何set -x关闭?
我在掌握 Bash 脚本的基础知识时遇到了麻烦。这是我到目前为止所拥有的:
#!/bin/bash
FILES="/home/john/my directory/*.txt"
for f in "${FILES}"
do
echo "${f}"
done
Run Code Online (Sandbox Code Playgroud)
我想要做的就是.txt在for循环中列出所有文件,以便我可以对它们进行处理。但是 中的空间my directory和*.txtjust 中的星号效果不佳。我尝试在带和不带双引号的情况下使用它,在变量名上带和不带花括号,但仍然无法打印所有.txt文件。
这是一个非常基本的事情,但我仍然在挣扎,因为我很累,无法直视。
我究竟做错了什么?
如果我的文件没有空格或星号,我已经能够成功应用上面的脚本......我不得不尝试使用或不使用双引号和大括号来让它工作。但是当我同时拥有空格和星号时,它就把一切都搞砸了。
我在各种堆栈交换站点和 unix 帮助论坛上阅读了许多关于如何修改 shell 选项然后恢复它们的问题 - 我在这里找到的最全面的问题是如何“撤消”`set -x`?
在收到的智慧似乎是要么保存过的结果set +o或shopt -po再eval后来恢复到以前的设置。
但是,在我自己使用 bash 3.x 和 4.x 进行的测试中,errexit在执行命令替换时,该选项无法正确保存。
这是显示问题的示例脚本:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
Run Code Online (Sandbox Code Playgroud)
和输出(我修剪了一些不相关的变量):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
Run Code Online (Sandbox Code Playgroud)
这似乎非常危险。errexit如果任何命令失败,我编写的大多数脚本都依赖于停止执行。我刚刚在我的一个脚本中找到了一个由此引起的错误,本应errexit在最后恢复的函数最终覆盖了它,在脚本运行期间将其设置回默认值off。
我希望能够做的是编写可以根据需要设置选项的函数,然后在退出之前正确恢复所有选项。但是好像在子shell中调用的命令替换,errexit是没有继承的。
我不知道如何在set +o …