Я хочу настроить функциональность cd
команды в соответствии с моими потребностями.
Я определил следующую функцию -
function cd () { cd "$@" && pushd "$@"; }
Цель этой функции - автоматически поместить каталог в стек, чтобы сэкономить время, необходимое для ввода вручную pushd .
каждый раз.
Однако указанная выше функция является бесконечно рекурсивной, так как вызов cd
интерпретируется как сама функция, а не как cd
встроенная.
Как мне ссылаться на cd
встроенную в эту функцию?
Я знаю, что псевдонимы можно избежать с помощью \
. Каким образом можно избегать функций или ссылаться на встроенные модули более явным образом?
Примечание. Я не хочу переименовывать свою функцию во что-либо еще.
bash
shell-script
shell-builtin
Кшитиз Шарма
источник
источник
alias cd=pushd
? Что вы ожидаете случиться, когда вы перейдете к чему-то, что не является абсолютным путем (например,cd ../
)?pushd
не поддерживает-P
. Но вы правы, как показано в вопросе,function cd
выглядит немного неправильно, так как он дважды менял каталог.Ответы:
В
command
BUILTIN сила имя команды должна интерпретироваться как встроенная , так и внешняя команда (пропуск псевдонима и функция поиска). Он доступен во всех оболочках POSIX, включая bash.(Обратите внимание, что этот пример плохой: он не работает с относительными путями, и вы могли бы просто напечатать
pushd
в первую очередь.)В bash и zsh (но не в ksh) вы можете использовать,
builtin
чтобы имя команды интерпретировалось как встроенное, исключая псевдонимы, функции и внешние команды.источник
Bash имеет (встроенную) команду
builtin
, которая делает именно то, что вам нужно. Заменаcd
наbuiltin cd
в вашей функции исправит рекурсию.источник
Я подозреваю, что когда вы говорите, что «не хотите переименовывать свою функцию во что-либо еще», вы подразумеваете, что хотите иметь возможность вызывать вашу функцию с тем же именем, что и исходная команда.
Итак, еще один способ сделать это, который также работает для вещей, которые не являются встроенными, это присвоить вашей функции другое имя, а затем определить псевдоним для перенесенной команды. Это работает, потому что псевдоним не существует в контексте выполнения вашей функции.
Пример wrapper.sh:
И, например, .bash_aliases:
Но это довольно глупо. Использование
command
предпочтительнее, когда это возможно.источник
Чтобы это работало с относительными путями, необходимо следующее:
Это предполагает, что вы находитесь в достаточно современном дистрибутиве Linux, который содержит утилиту 'realpath'. (RHEL 6 не например). Если Perl доступен, 'realpath' может быть смоделирован с использованием:
источник