Perl меняет рабочий каталог вызывающего абонента

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


person pythonic metaphor    schedule 10.05.2011    source источник
comment
К счастью, это невозможно.   -  person Ingo    schedule 10.05.2011


Ответы (4)


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

person Daenyth    schedule 10.05.2011
comment
«Невозможно» не является сверхстрогой правдой. Я сделал такую ​​гадость. Однако любой, на кого это освобождение от обычных правил и положений не распространяется, определенно не будет применяться, не будет спрашивать об этом здесь. Определенно лучше, если они думают, что это невозможно: подумайте, пытались ли они, но промахнулись. :) - person tchrist; 11.05.2011

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

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

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

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

person tchrist    schedule 10.05.2011
comment
Надеюсь, вы не опубликовали код. Ибо, когда такие скрипты когда-нибудь станут обычным явлением, точно пора бы перейти на другую ОС. OTOH, к счастью, не все являются root (вам нужно быть root для этого, не так ли?) - person Ingo; 11.05.2011
comment
@Ingo: Да, для этого вам нужно быть пользователем root. - person tchrist; 11.05.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 "$@"

и источник 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)

person mob    schedule 10.05.2011
comment
Это гораздо более полезный ответ, чем «Не делай этого, это неправильно». Спасибо. - person Rex Schrader; 04.12.2014

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

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