我希望能够写入*
我的脚本并保持*
原样(即无需扩展)。
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
是您的外部脚本。这里它只是echo
s 其参数并以退出状态 退出7
。setup
是创建辅助函数和别名的脚本;必须使用source
d(带点)才能将函数和别名添加到您当前的 shell。
当您运行 时myscript
,会调用别名,并在解析参数并将其传递给 之前运行set -o noglob
(与 相同) 。当函数运行时(在当前 shell 中),它首先会重置,然后使用指定的参数调用脚本并返回退出状态(在本例中)。set -f
myscript_helper
myscript_helper
noglob
myscript
7
此技巧仅应用于交互式使用。在此特定用例中,结果可能非常令人惊讶,但此通用技术可用于各种情况。例如,我使用此方法(在命令行)调用需要运行的脚本xyz
,source
但别名xyz
会帮我source
运行该脚本。xyz