Псевдоним команды 'cd' с Subshell не работает должным образом

Я только что узнал об псевдонимах в bash. Я создал один так:

alias="cd $directory"

где $directory это от использования ввода. В другом сценарии оболочки я могу запустить подоболочку следующим образом:

( bash )

что подводит меня к сути дела, где, если я бегу cdЯ иду на псевдоним, cd $directory, Это здорово, и, кажется, работает как положено.

То, что я ищу, это когда запускается подоболочка, CD происходит автоматически, поэтому я попробовал:

( bash | cd )

думая, что запустит subshell и cd для введенного пользователем $directoryно это не работает Как я могу заставить это работать? Я тоже пробовал ( bash -c cd) но безрезультатно.

Благодарю.

1 ответ

Решение

Причина того, что ( bash | cd ) не работает в том, что каждая команда в конвейере запускается в отдельной подоболочке, поэтому ( bash | cd ) по существу эквивалентно ( ( bash ) | ( cd ) ) (кроме того, что последний запускает еще больше подоболочек, конечно). Вместо этого вы должны написать:

( cd ; bash )

(который работает cd перед запуском bash) поскольку bash будет наследовать копию среды выполнения подоболочки, из которой он был запущен.

Кстати - вы уверены, что хотите создать cd как псевдоним таким образом? Это кажется ошибочным и запутанным для меня. Я думаю, что было бы лучше создать функцию оболочки, которая cds в указанный пользователем каталог:

function cd_user () { cd "$directory" ; }

( cd_user ; bash )
Другие вопросы по тегам