Я хочу написать Perl-скрипт, который меняет свой рабочий каталог на какой-то другой, делает что-то, а затем оставляет меня в этом каталоге после того, как я вызываю его из оболочки. chdir
делает только первую часть. Как изменить рабочий каталог вызывающего абонента?
Perl меняет рабочий каталог вызывающего абонента
Ответы (4)
То, что вы хотите сделать, невозможно. Ближе всего было бы написать какой-нибудь bash, который делает то, что вы хотите, а затем в вызывающей оболочке использовать его вместо запуска. Программное обеспечение не может повлиять на вызывающую его оболочку.
Это возможно возможно.
Однако вам придется открыть одно из устройств /dev/mem
в режиме чтения/записи, найти нужное место в памяти, где хранится пара [dev,ino]
родительского процесса для его cwd
, и ткнуть в него новым.
И даже если бы тебе это удалось, я сомневаюсь, что ты смог бы посмотреть на себя в зеркало на следующее утро. Я точно знаю, что никогда не мог. :) Тем не менее выражение полного удивления на лицах моих коллег как-то стоило того. Я изменил подсказки их оболочки с одной команды на другую, используя этот метод. Это было просто дорого. Они просто не могли понять это, пока я не рассказал им, как я это сделал.
Это также не рекомендуется. :)
Оберните ваш сценарий perl в сценарий оболочки, измените каталог из сценария bash перед выполнением сценария perl и создайте сценарий.
Итак, вместо сценария Perl, например:
#!/usr/bin/perl
# my_program.pl ...
chdir "/my/directory";
...
Используйте, скажем, скрипт bash, например:
#!/usr/bin/bash
cd /my/directory
perl my_program.pl "$@"
и источник script, когда вы его вызываете, т.е.
$ source my_bash.sh
or
$ . my_bash.sh
(Теперь вы можете использовать синтаксис heredoc и поместить все это в один сценарий:
#!/usr/bin/bash
cd /my/directory
perl <<EOF
... include your perl script here ...
EOF
Но я не думаю, что вы могли бы использовать переменные @ARGV
)
Вы можете сделать следующее, чтобы имитировать эффект:
- Вызовите свой скрипт с помощью exec
- В вашем скрипте вместо выхода запустите новую оболочку.