我正在尝试编写一个别名,该别名将跳转到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。
有什么建议吗?
答案 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))