Perl меняет рабочий каталог вызывающего - PullRequest
3 голосов
/ 10 мая 2011

Я хочу написать Perl-скрипт, который меняет свой рабочий каталог на что-то другое, что-то делает, а затем оставляет меня в этом каталоге после того, как я вызываю его из оболочки. chdir делает только первую часть. Как изменить рабочий каталог звонящего?

Ответы [ 4 ]

9 голосов
/ 11 мая 2011

Это возможно .

Однако вам придется открыть одно из /dev/mem устройств в режиме чтения / записи, найти нужное место в памяти, в котором хранится пара [dev,ino] родительского процесса для его cwd, и ткнуть его с помощью новый.

И даже если бы тебе удалось, я сомневаюсь, что ты сможешь посмотреть на себя в зеркало на следующее утро. Я точно знаю, что никогда не мог. :) Тем не менее, выражение полного удивления на лицах моих коллег как-то стоило того. Я изменил подсказки их оболочки с одной команды на другую, используя этот метод. Это было просто драгоценно. Они просто не могли понять, пока я не скажу им, как я это сделал.

Это также не рекомендуется. :)

5 голосов
/ 11 мая 2011

Оберните ваш сценарий perl в сценарий оболочки, измените каталог из сценария bash перед выполнением сценария perl и создайте исходный код сценария.

Поэтому вместо сценария Perl, например:

#!/usr/bin/perl
# my_program.pl ...
chdir "/my/directory";
...

Используйте, скажем, сценарий bash, например:

#!/usr/bin/bash
cd /my/directory
perl my_program.pl "$@"

и создайте сценарий при его вызове, например

$ source my_bash.sh

или

$ . my_bash.sh

(Теперь вы можете использовать синтаксис heredoc и поместить все это в один скрипт:

#!/usr/bin/bash
cd /my/directory
perl <<EOF
... include your perl script here ...
EOF

Но я не думаю, что вы могли бы использовать @ARGV переменные)

5 голосов
/ 10 мая 2011

То, что вы хотите сделать, невозможно. Самым близким было бы написать некоторый bash, который делает то, что вы хотите, а затем в вызывающей оболочке создать его вместо запуска. Программное обеспечение не может влиять на оболочку, которая его вызывает.

2 голосов
/ 10 мая 2011

Вы можете сделать следующее, чтобы смоделировать эффект:

  1. Вызовите ваш скрипт с помощью exec
  2. В вашем скрипте вместо выхода выполните новую оболочку exec.
...