2016-09-29 6 views
3

Мой первый вопрос о SO, поэтому извиняюсь, если ничего не делать правильно!Cd in a Bash FUNCTION

В интернете есть много вопросов об использовании cd внутри скрипта, но моя проблема заключается в использовании cd внутри функции bash, которую я установил в свой .bashrc. Его задача - найти файл и перейти в рабочий каталог файла. В случае обнаружения нескольких файлов, я просто перехожу к первому. Вот оно:

fcd() { 
cd $PWD 
if [ -z "$1" ]; then 
    echo 'Specify a file name to find' 
else 
    found_dir=$(find . -name $1 -type f -printf \"%h/\" -quit) 
    echo $found_dir 
    if [ -z "$found_dir" ]; then 
     echo "No file found. Directory was not changed" 
    else 
     cd $found_dir 
    fi 
fi 
} 

Однако, когда я использую его, каталог найден, но при попытке cd $found_dir результатов в сообщении:

cd: (directory_here): No such file or directory 

Я исключил возможность путь ошибиться - копируя вывод echo $found_dir и вставляя его перед cd, каталог с успехом изменен. Есть идеи?

Спасибо,

Якуб

ответ

6

Вы не должны процитировать каталог в команде Find, вы должны процитировать его позже, когда вы используете переменную. Таким образом, изменение команды поиска из

find . -name $1 -type f -printf \"%h/\" -quit 

в

find . -name "$1" -type f -printf %h -quit 

Первая команда возвращает путь к каталогу, в кавычках, так как в "/path/to/dir". Поэтому, когда вы пытаетесь установить cd в этот каталог, cd будет считать, что кавычки являются частью пути.

Затем отрегулируйте cd к cd "$found_dir", чтобы гарантировать, что cd не потерпит неудачу, если $found_dir содержит специальные символы, такие как пробел или *.

Также обратите внимание, что cd $PWD является избыточным, поскольку мы уже находимся в этом каталоге. На самом деле это может вызвать проблемы, поскольку вы не указываете эту переменную.

+0

О да, cd $ PWD была моей глупой попыткой отладки. Ваше решение сработало, вы, ребята, самые лучшие! –