Bash: вложенные черты в псевдониме вызывают проблемы - PullRequest
9 голосов
/ 19 января 2012

Я пытаюсь написать псевдоним, который будет переходить в каталог-потомок 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 ]

16 голосов
/ 19 января 2012

Псевдоним не может принимать аргумент типа $1. Вместо этого используйте функцию.

Также используйте $(command) для подстановки команд вместо обратных кавычек, так как их легче вкладывать.

Функция будет:

jump() {
    cd $(dirname $(find -name "$1" | sed -n 1p))
}
3 голосов
/ 19 января 2012

Обратные пометки - это старая форма подстановки команд , и вы не можете их легко вкладывать.Однако новая форма $() легко вкладывается:

cd $(dirname $(find -name 'MyFile.txt' | sed -n 1p))
3 голосов
/ 19 января 2012

Backticks не предлагает вложенности. Попробуйте использовать command substitution с синтаксисом $(..)

В вашем случае это будет

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