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

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

  • Написание сценариев, которые используют разные команды в разных оболочках
  • Зачем . / home / Desktop неправильный и ./Desktop правильно?
  • SQLPLUS с циклами сценариев оболочки
  • Способ записи нового имени файла на подстановочный знак?
  • Как инициализировать массив с помощью awk и bash?
  • sed заменить на backspace
  • Как перенаправить одно и то же сообщение на stdoud и stderr (без временного объекта)
  • Как перемещать файлы во вновь созданный каталог при условии в shell / perl
  • Вывод команды «history» после повторного подключения через SSH
  • Относительно отдельного файла в несколько файлов в соответствии с разделом строк
  • Передавать параметры командной строки программе внутри сценария оболочки
  • Linux и Unix - лучшая ОС в мире.