это - possibe для изменения рабочего каталога родительской оболочки программно?

Для первой части:

$ssh << abc.txt

Для второй части:

$ssh <<- remote.txt
8
09.02.2014, 00:14
3 ответа

сделать 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
}
23
27.01.2020, 20:08
  • 1
    Спасибо, не думали об использовании функций, и это просто включает все: Я могу теперь позволить mycd передача $@ к любой программе мне нравится. –  Javran 09.02.2014, 19:48
  • 2
    Удостоверяется, что Вы заключаете в кавычки "$@" так, чтобы любые аргументы, содержащие пробел, были обработаны правильно. –  glenn jackman 10.02.2014, 02:09

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

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

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

9
27.01.2020, 20:08
  • 1
    Существует на самом деле шанс заставить его "работать", но это нетривиально, подвержено ошибкам и должно избежаться любой ценой. Чтобы показать, что это на самом деле "возможно", рассмотрите этот сценарий оболочки, где родитель является Bash: 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) все еще неизменно, глаза людей повреждены, и т.д. Так не делайте этого, даже если это возможно. –  Lekensteyn 09.02.2014, 17:58
  • 2
    @Lekensteyn Это ptrace метод я упоминаю. Это работает хорошо над программами, которые не заботятся очень об их текущем каталоге. В оболочке, большом количестве вещей (PWD переменная, подсказка, и т.д.), собираются стать неправильным, и оболочка может отказать или иначе неправильно себя вести. –  Gilles 'SO- stop being evil' 09.02.2014, 18:03

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

Вы можете однако...

  • используйте псевдоним:
    alias mycd2='cd /a/very/long/path/name'
  • имейте свой script1, производит допустимую команду оболочки...

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

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

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

5
27.01.2020, 20:08
  • 1
    Псевдоним проходим. Сценарий является той же проблемой, которую он уже имеет. Этот вопрос кричит функция оболочки. –  Ricky Beam 08.02.2014, 23:49

Теги

Похожие вопросы