gpt4 book ai didi

bash - 如何在引用的表达式中转义扩展路径名扩展模式?

转载 作者:行者123 更新时间:2023-11-29 09:08:23 25 4
gpt4 key购买 nike

除了基本的 *?[...] 模式之外,Bash shell 还提供扩展模式匹配运算符,如 !(pattern-list)(“匹配除给定模式之一之外的所有模式”)。需要设置 extglob shell 选项才能使用它们。一个例子:

~$ mkdir test ; cd test ; touch file1 file2 file3
~/test$ echo *
file1 file2 file3
~/test$ shopt -s extglob # make sure extglob is set
~/test$ echo !(file2)
file1 file3

如果我将 shell 表达式传递给在子 shell 中执行它的程序,运算符会导致错误。这是一个直接运行子 shell 的测试(这里我从另一个目录执行以确保扩展不会过早发生):

~/test$ cd ..
~$ bash -c "cd test ; echo *"
file1 file2 file3
~$ bash -c "cd test ; echo !(file2)" # expected output: file1 file3
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd test ; echo !(file2)'

我已经尝试过各种转义,但我想出的任何一个都无法正常工作。我还怀疑 extglob 没有在子 shell 中设置,但事实并非如此:

~$ bash -c "shopt -s extglob ; cd test ; echo !(file2)"
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd test ; echo !(file2)'

感谢任何解决方案!

最佳答案

bash 在执行每一行之前对其进行解析,因此当 bash 验证 globbing 模式语法时,“shopt -s extglob”不会生效。不能在同一行启用该选项。这就是为什么“bash -O extglob -c 'xyz'”解决方案(来自 Randy Proctor)有效并且是必需的。

关于bash - 如何在引用的表达式中转义扩展路径名扩展模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/529054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com