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

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

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

3 Solutions collect form web for “возможно ли программно изменить рабочий каталог родительской оболочки?”

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 в примере.

  • Найти файл с расширением .csv в каталоге, соответствующем шаблону
  • Как я могу настроить $ PROMPT_COMMAND без перезаписи по умолчанию (если есть)?
  • Как перемещать файлы во вновь созданный каталог при условии в shell / perl
  • Что делает $ {3 #?}?
  • Dotfile не работает в текущей оболочке, нужен новый
  • Как запустить программу в фоновом режиме
  • Как получить символ в заданной позиции строки в сценарии оболочки?
  • Запуск внешнего скрипта с исходной командой
  • Время вилки против поточной системы
  • Переименование содержимого всей папки
  • Могу ли я подключиться к команде cd?
  • Interesting Posts

    «Ошибка создания прокси» на терминале gnome

    Как остановить скрипты bash от выхода из окна в целом

    Вычислить медианное значение для столбца и сказать, если это значение «ОК» или «ОШИБКА», если оно находится в допустимом диапазоне

    Разбивка идентификаторов rpm для файлов разделяемой библиотеки

    Сумерский черный список

    ключ eCryptfs в изображении ядра или initramfs

    setfacl не работает в файлах, созданных Apache

    что может определять переменную $ PATH?

    Найти имена файлов, которые не содержат заданную строку

    Сценарий оболочки для запуска программы с аргументами

    Как преобразовать беззнаковое десятичное число (менее 1 << 32) в 4 байта (двоичное) в bash?

    Какая связь между результатами теста ping и telnet?

    Нужен сценарий оболочки для копирования файлов с длинными именами и именами

    FreeBSD 10: отключить полное шифрование диска ZFS

    Можно ли перечислить открытые очереди SysV для определенных файлов?

    Linux и Unix - лучшая ОС в мире.