#linux #bash
Хотел сделать алиас cd, который будет сразу перечислять директории. Попробовал все следующие варианты: alias 'cd'='cd $1; l' alias 'cd'='cd $1; l $1' alias 'cd'='cd $1 && l' alias 'cd'='cd $1 && l $1' Где, l (строчная «L») — алиас другого приложения (tree). Всегда перегружал терминал, чтобы наверняка, так как . ~/.bash_aliases у меня почему-то не срабатывает. Все вышеперечисленные алиасы при вводе cd / перечисляют список директорий / файлов в точке монтирования /, однако смена директории не происходит. Тогда я попробовал прописать в том же .bash_aliases функцию (оба варианта, по очереди): cd() { cd $1 l } function cd() { cd $1 l } В итоге, при выполнении cd / команда «виснет» ... Единственный способ, который я нашёл, это сделать так: cdl() { cd $1 l } То есть задать другое имя ... Но в тоже время, если вернуться к первому варианту алиаса: alias 'cd'='cd $1; l' Здесь же срабатывает cd при вводе cd /, так как l перечисляет список директорий / файлов по пути /, так почему же тогда он возвращает обратно в домашнюю директорию?
Ответы
Ответ 1
псевдоним оболочки (shell alias) — это не функция и не программа. у псевдонима нет аргументов, его описание всего лишь подставляется в команду вместо его имени. поэтому, если вы определили, например, такой псевдоним: $ alias cd='cd $1; ls' то при вводе команды $ cd /tmp она преобразуется в $ cd ; ls /tmp обратите внимание на пустое место после cd — туда ничего не будет подставлено (вместо $1), т.к. переменная $1 не содержит никакого значения. в результате вашим текущим каталогом станет ваш домашний каталог (так действует внутренняя команда cd, если ей не передать никаких параметров), а затем будет выполнена команда ls /tmp. когда вы определяете функцию: $ function cd() { cd $1; ls; } команда cd $1 внутри её тела трактуется как рекурсивное обращение к этой же функции, вот и происходит «зависание». кстати, обратите внимание, что в теле псевдонима не происходит такой рекурсии — cd $1 там трактуется именно как обращение к внутренней команде оболочки cd. и напоследок, в виде факультативного дополнения к ответу на вопрос «почему», приведу пример того, как сделать, чтобы «работало так, как хочется»: $ function cd() { command cd "$@"; ls; } использовать надо именно функцию (кстати, само ключевое слово function в данном случае — опционально), чтобы получить и обработать список аргументов. для вызова внутренней команды оболочки надо использовать внутреннюю же команду command. правильнее передавать не только первый аргумент, а все аргументы ($@), а чтобы корректно обрабатывались спец-символы (например, пробелы/кавычки и т.п.) внутри аргументов, список лучше заключить в двойные кавычки ("$@").
Комментариев нет:
Отправить комментарий