2012-01-19 13 views
9

Próbuję napisać alias który skokiem potomek katalogu CWD, który zawiera określony plik (lub pierwszej find uznał wystąpienie takiego pliku):Bash: zagnieżdżone backticks problemy powodują alias

Poniższa kombinacja poleceń osiąga pożądany rezultat:

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

jednak nie wydaje się uciec to w prawidłowy sposób, aby utworzyć alias pracy:

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

wyjściowa:

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

Moja logika jest taka, że ​​backticks potrzeba ucieczki w podwójnym cudzysłowie z jednym \ i nie mogę zrobić \\ zostanie przetłumaczony na jeden ukośnik w ciągu, więc druga zagnieżdżona grawis wymaga 1 + 2 = 3.

Wszelkie sugestie?

Odpowiedz

13

Alias ​​nie mogą brać argument jak $1. Zamiast tego użyj funkcji.

Użyj także $(command) do podstawiania komend zamiast odskoków, ponieważ łatwiej jest zagnieździć.

Funkcja byłoby:

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

Dziękuję wszystkim za informacje o dolarze. Specjalne podziękowania dla dogbane za odpowiedź na dokładnie pytanie, które zadałem - jak stworzyć alias przy użyciu tego podejścia. – KomodoDave

3

Backticks nie oferuje zagnieżdżania. Spróbuj użyć command substitution który ma składnię $(..)

W twoim przypadku będzie to

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

backticks oferują zagnieżdżania, ale trzeba do nich uciec z ukośniki, która szybko staje się niewygodna dla wielu poziomach zagnieżdżenia. Składnia '$ {..}' jest o wiele łatwiejsza dla oczu. – mjuarez

2

backticks są starą formą command substitution, i nie można ich łatwo gniazdo. Jednak nowy $()form robi gniazdo łatwo:

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