Intereting Posts
Как увеличить таймер перед вращением диска? Используйте openbox вместо kwin в Plasma 5 Прокси-сервер Http для выбора внешнего интерфейса на основе заголовка хоста В чем разница между pidof и pgrep? Почему некоторые приложения оставляют события KeyRelease потребляемыми следующим ориентированным приложением / окном Условный env proxy? биос, загрузчик, запуск ядра и драйвер экрана Гостевые дополнения в VirtualBox Не удалось добавить новое соединение: (2) Требуется «беспроводная» настройка с действительным SSID, если не был задан путь доступа к сети Скрыть или маску каталога для процесса на OS-X команда linux + top Как определить определенный порядок для значков лотков в i3 Как добавить приложения в панель запуска приложения lxpanel через cli? Xinerama misbehaving – перетаскивание на неправильный экран Как я могу перечислить каждый файл в каталоге, кроме тех, у которых указаны указанные расширения?

возможно ли программно изменить рабочий каталог родительской оболочки?

Я хочу написать некоторый код, чтобы позволить мне переключиться на некоторые каталоги, к которым я обычно иду. Предположим, что эта программа является 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 . mycd 2 чтобы сделать желаемую вещь, потому что иначе скрипт просто выполняется в дочернем скрипте, который ничего не меняет о родительской оболочке, на которой я действительно забочусь.

Мой вопрос:

  • могу ли я сделать это без использования source ? потому что . mycd . mycd предполагает, что mycd должен быть скриптом оболочки, и это может также ввести некоторые функции, которые я не хочу.

  • могу ли я реализовать его на некоторых других языках программирования?

make mycd – функция, поэтому команда cd выполняется в вашей текущей оболочке. Сохраните его в файле ~ / .bashrc.

 function mycd { if (( $# == 0 )); then echo "usage: $FUNCNAME [1|2|3|...]" return fi case $1 in 1) cd /tmp ;; 2) cd /a/very/long/path/name ;; 3) cd /some/where/else ;; *) echo "unknown parameter" ;; esac } 

Вы не можете изменить текущий каталог оболочки из другого процесса. Только сам процесс может изменить свой собственный текущий каталог. Это также относится к некоторым другим характеристикам, таким как переменные среды и дескрипторы файлов.

Фактически это может повлиять на текущий каталог другого процесса, заставив его выполнить системный вызов chdir через системный вызов ptrace , что и позволяет отладчикам работать. Однако, если процесс поддерживает некоторые внутренние структуры данных, которые должны быть совместимы с фактическим текущим каталогом, программа, скорее всего, выйдет из строя. Для оболочки этот подход не имеет шансов работать.

Вам необходимо организовать, чтобы ваш код исполнялся самой оболочкой. Обычным способом продолжения было бы сделать его функцией оболочки и сохранить ее в ~/.bashrc . Если это невозможно, например, потому что это код, который вы хотите распространять, напишите исходный файл оболочки, содержащий определение функции, и сообщите людям, чтобы их интерактивная оболочка читала ваш файл с помощью . команды .

Как вы сами указали, сценарии оболочки всегда выполняются в подоболочке, что не может влиять на ее родительскую оболочку.

Однако вы можете …

  • используйте псевдоним:
    alias mycd2='cd /a/very/long/path/name'
  • у вашего скрипта 1 выдается действительная команда оболочки …

     #!/bin/bash if [ "x$1" = "x2" ] then echo "cd /a/very/long/path/name" fi 

    … и выполнить его вывод: $(mycd 2)

1: Вероятно, вы захотите использовать оператор case а не условие if в примере.