Я хочу написать некоторый код, который позволит мне переключаться на некоторые каталоги, в которые я обычно хожу. Скажем, эта программа mycd
и /a/very/long/path/name
каталог, в который я хочу перейти.
Так что я могу просто напечатать mycd 2
вместо cd /a/very/long/path/name
. Здесь я предполагаю, что mycd
знает 2
относится к этому /a/very/long/path/name
. Там также может быть mycd 1
, mycd 3
... и т.д.
Проблема в том, что мне нужно написать mycd
как сценарий оболочки и набрать, . mycd 2
чтобы выполнить желаемую вещь, потому что в противном случае сценарий просто исполняется в дочернем сценарии, который ничего не меняет в родительской оболочке, которая мне действительно нужна.
Мой вопрос:
я могу сделать это без использования
source
? потому что. mycd
предполагает, чтоmycd
это должен быть скрипт оболочки, и это может также привести к появлению некоторых функций, которые мне не нужны.я могу реализовать это на некоторых других языках программирования?
источник
mycd
перейти$@
к любой программе , мне нравится."$@"
чтобы любые аргументы, содержащие пробелы, обрабатывались правильно.Вы не можете изменить текущий каталог оболочки из другого процесса. Только сам процесс может изменить свой текущий каталог. Это также относится к некоторым другим характеристикам, таким как переменные среды и файловые дескрипторы.
Фактически возможно повлиять на текущий каталог другого процесса, заставив его выполнить
chdir
системный вызов черезptrace
системный вызов, что позволяет отладчикам работать. Однако, если процесс поддерживает некоторые внутренние структуры данных, которые должны быть согласованы с фактическим текущим каталогом, программа, вероятно, завершится сбоем. Для оболочки этот подход не имеет шансов работать.Вы должны организовать выполнение своего кода самой оболочкой. Обычный способ продолжить это сделать функцию оболочки и сохранить ее в вашем
~/.bashrc
. Если это невозможно, например, потому что это код, который вы хотите распространить, напишите исходный файл оболочки, содержащий определение функции, и скажите людям, чтобы их интерактивная оболочка прочитала ваш файл с помощью.
команды .источник
ws=$1; gdb -p $(ps h -o ppid -p $$) -ex "call chdir(\"$wd\")" -ex "call set_working_directory(\"$wd\")" -ex detach -ex q -batch
. Выполнить какbraindead-cd-parent /
. Вы увидите, чтоpwd
возвращается/
и так ведетls
себя. Но подсказка (PS1
) остается неизменной, глаза болят и т. Д. Поэтому не делайте этого, даже если это возможно.ptrace
метод, который я упоминаю. Это хорошо работает на программах, которые не заботятся о своем текущем каталоге. В оболочке многие вещи (PWD
переменные, подсказки и т. Д.) Могут стать неправильными, и оболочка может аварийно завершить работу или неправильно работать.Как вы указали сами, сценарии оболочки всегда выполняются в подоболочке, которая не может влиять на ее родительскую оболочку.
Вы можете однако ...
alias mycd2='cd /a/very/long/path/name'
ваш скрипт 1 выведет правильную команду оболочки ...
... и выполнить вывод:
$(mycd 2)
1: Вы, вероятно, захотите использовать
case
утверждение, а неif
условие в примере.источник