我写了一个bash函数,可以帮助我更快地浏览项目目录。该函数的第一个参数是传递给python脚本的关键字,该脚本确定cd的基本路径。如果将其他参数传递给该函数,它将按传递顺序进入每个子目录。例如:
$ go intf -> cd to $BASE/interface
$ go intf foo -> cd to $BASE/interface/foo
当我使用通配符-和时出现问题,通配符在执行函数的目录中匹配。因此,请考虑简单的目录结构:
$BASE/foo1
$BASE/interface/foo
如果我目前在$BASE
,并且我运行:
$ go intf foo*
我的命令将我带到$BASE/interface
,然后尝试进入新路径中不存在的foo1
。除非模式与原始目录中的模式匹配,否则这种表示法可以很好地发挥作用。
这是我的功能(省略了错误检查)。最后,for循环是我要为上述情况“修复”的内容。我尝试使用eval "cd [...]"
以及其他引号,循环等形式。
go() {
OUTPUT=$(python ~/bin/go.py $1)
cd "$OUTPUT"
for i in "${@:2}"; do cd "$i"; done
}
所以基本上,我不希望在执行for-loop cd
命令之前对星号进行求值,而我不希望必须用引号将每个通配符arg包裹到我的函数调用中。如何防止/延迟通配符扩展以满足我的需求?
答案 0 :(得分:0)
所以我一直坚持这个问题,但是在Gordon Davisson指出我不可能解决问题的方法之后,想出了一个非常简单的解决方案。
我将功能从cd "$i"
更改为cd *$i*
:
go() {
OUTPUT=$(python ~/bin/go.py $1)
cd "$OUTPUT"
for i in "${@:2}"; do cd *$i*; done
}
这解决了我遇到的特殊情况,仍然适用于普通情况,并且由于不再需要添加星号,所以我变得更懒惰了:)
答案 1 :(得分:0)
这取决于您如何为函数设置参数。
我将以ls
为例,但是它与function
的工作原理相同。
如果用单引号('
)封装参数,则bash不会扩展该值,但是如果不封装或使用双引号("
)进行封装,则bash会扩展它的值。
请参见以下示例:
$ ls /tmp/demo/
dir1 dir2
$ ls /tmp/demo/*
/tmp/demo/dir1:
/tmp/demo/dir2:
$ ls '/tmp/demo/*'
ls: cannot access '/tmp/demo/*': No such file or directory