Как изменить текущий рабочий каталог внутри command_not_found_handle - PullRequest
4 голосов
/ 20 марта 2011

Я пытаюсь написать не найденный дескриптор в Bash, который выполняет следующее:

  1. Если существует $ 1 и это каталог, cd в него.
  2. Если$ 1 существует в пользовательском каталоге $DEV_DIR, `cd в него.
  3. Если предыдущие условия не применяются, не удаются.

Прямо сейчас у меня есть что-то вроде этого:

export DEV_DIR=/Users/federico/programacion/

function command_not_found_handle () {
    if [ -d $1 ]; then          # the dir exists in '.'
        cd $1
    else
        to=$DEV_DIR$1
        if [ -d $to ]; then
            cd $to
            echo `pwd`
        else
            echo "${1}: command not found"
        fi
    fi
}

И хотя это, кажется, работает (команда echo pwd печатает ожидаемый каталог), каталог в реальной оболочке не изменяется.

У меня сложилось впечатление, что, поскольку это функция внутри моего .bashrc, оболочка не будет работать, и я смогу выполнить cd, но, очевидно, это не работает.Любые советы о том, как решить эту проблему, будут оценены.

Ответы [ 3 ]

3 голосов
/ 20 марта 2011

I думаю , что происходит, это то, что оболочка fork() s после настройки любых перенаправлений, но до поиска команд, поэтому command_not_found_handle не может повлиять на процесс интерактивной оболочки.

1 голос
/ 21 марта 2011

То, что вы хотите сделать, отчасти возможно при использовании функции autocd:

shopt -s autocd

С man bash:

autocd - если установлено, командаname, которое является именем каталога, выполняется так, как если бы оно было аргументом команды cd.Эта опция используется только интерактивными оболочками.

В противном случае просто создайте функцию, которую вы вызываете по имени, которая выполняет действия, для которых вы пытаетесь использовать command_not_found_handle.

0 голосов
/ 20 марта 2011

Это не изменит направления, если вы запустите эту программу как сценарий в своей основной оболочке, потому что она создает под-оболочку при выполнении. Если вы поставите скрипт в вашей текущей оболочке, он будет иметь желаемый эффект.

~/wbailey> source command_not_found.sh

Тем не менее, я думаю, что следующий результат достиг бы того же результата:

wesbailey@feynman:~/code_katas> cd xxx 2> /dev/null || cd ..; pwd
/Users/wesbailey

просто замените ".." на каталог, определенный в env var, и создайте псевдоним в файле .bashrc.

...