有没有办法禁用某些 bash 命令的星号 * 插值?

有没有办法禁用某些 bash 命令的星号 * 插值?

我希望能够写入* 我的脚本并保持*原样(即无需扩展)。

Bash 将尝试用与该模式匹配的本地文件替换它,如果该模式不存在,bash 将不加修改地传递星号。

我不想逃跑。我知道这是可能的 ( *, '*' )。

例如

myscript --arg *   --- will pass local files to the script
myscript --arg=*   --- will pass "--arg=*", since there are no filenames starting with "--arg=<...>"

我可以告诉 bash 在某些情况下跳过通配符解释吗?例如以 开头的命令myscript

答案1

是的。您可以使用set -f

set -f
echo *  # prints *
# turn glob expansion back on, if you want:
set +f

如果您选择这条路线,您必须在调用脚本的终端中设置它,而不是在脚本本身中设置它,因为它*在作为参数到达脚本之前会扩展。

正如评论中提到的那样,最好只是*通过'*'"*"或 来转义\*

答案2

$ cat myscript
for a ;do echo "-$a-"; done
exit 7

$ cat setup
myscript_helper() { set +o noglob; ./myscript "$@"; }
alias myscript='set -o noglob; myscript_helper'

$ source setup

$ myscript *; echo $? *
-*-
7 myscript setup

myscript是您的外部脚本。这里它只是echos 其参数并以退出状态 退出7setup是创建辅助函数和别名的脚本;必须使用sourced(带点)才能将函数和别名添加到您当前的 shell。

当您运行 时myscript,会调用别名,并在解析参数并将其传递给 之前运行set -o noglob(与 相同) 。当函数运行时(在当前 shell 中),它首先会重置,然后使用指定的参数调用脚本并返回退出状态(在本例中)。set -fmyscript_helpermyscript_helpernoglobmyscript7

此技巧仅应用于交互式使用。在此特定用例中,结果可能非常令人惊讶,但此通用技术可用于各种情况。例如,我使用此方法(在命令行)调用需要运行的脚本xyzsource但别名xyz会帮我source运行该脚本。xyz

相关内容