Bash:别名中的嵌套反引号会导致问题

时间:2012-01-19 15:22:51

标签: bash escaping find nested

我正在尝试编写一个别名,该别名将跳转到cwd的后代目录,该目录包含指定的文件(或找到的第一个find个文件名)

以下命令组合可实现所需的结果:

cd `dirname \`find -name 'MyFile.txt' | sed -n 1p\``

但是,我似乎无法以正确的方式逃避这一点,以创建一个工作别名:

alias jump="cd \`dirname \\\`find -name '$1' | sed -n 1p\\\`\`"

输出:

/*
dirname: missing operand
Try `dirname --help' for more information.
bash: cd: find: No such file or directory

我的逻辑是反引号需要在带有单个\的双引号字符串中转义而我无法将\\转换为字符串中的单个反斜杠,因此第二个嵌套反引号需要1 + 2 = 3。

有什么建议吗?

3 个答案:

答案 0 :(得分:16)

别名不能使用$1之类的参数。改为使用函数。

同样使用$(command)进行命令替换而不是反引号,因为它更容易嵌套。

该功能将是:

jump() {
    cd $(dirname $(find -name "$1" | sed -n 1p))
}

答案 1 :(得分:3)

Backticks不提供嵌套功能。尝试使用语法为command substitution

$(..)

在你的情况下,它将是

cd $(dirname $(find /path/to/search -name 'MyFile.txt' | sed -n 1p)) 

答案 2 :(得分:3)

反引号是command substitution的旧形式,你不能轻易地嵌套它们。但是,新的$() form很容易嵌套:

cd $(dirname $(find -name 'MyFile.txt' | sed -n 1p))