Вызов pushd в сценарии оболочки

Найденный в ранних источниках Unix:

/*
 * You are not expected to understand this.
 */
if(rp->p_flag & SSWAP) {
    rp->p_flag =& ~SSWAP;
    aretu(u.u_ssav);
}

(Слегка отредактированный.)

6
29.12.2010, 02:40
3 ответа

Сценарий оболочки обычно выполняется в отдельном экземпляре программной оболочки, /bin/sh в этом случае. Ваш pushd управляйте влияет на рабочий каталог той подоболочки только. Если бы это было иначе, то любая программа, которую Вы запустили от оболочки, могла бы смешать с рабочим каталогом Вашей оболочки.

Для выполнения того сценария в текущей оболочке скажите это вместо этого:

$ . my-command somedir

или, больше verbosely:

$ source my-command somedir

Чтобы заставить ее появиться, что Ваша программа работает как любой другой, можно использовать псевдоним:

$ alias mycmd='source my-command'
$ mycmd /bin
$ pwd
/bin
8
27.01.2020, 20:25
  • 1
    , Что я действительно хочу, выполняются 'pushd <параметрические усилители>', сопровождаемые другой командой, которая не берет параметрических усилителей. Мне, возможно, не понадобится сценарий оболочки для него - что хороший путь состоит в том, чтобы сделать это? –   29.12.2010, 02:23
  • 2
    @sarah-soto Все, в чем Вы нуждаетесь затем, pushd <params>; other-command –  Shawn J. Goff 29.12.2010, 02:26
  • 3
    я должен был разъясниться: Я хочу ярлык, таким образом, я вызываю обе команды один после после, неявно не называя обоих. Я не могу aliase две команды, чтобы быть p2 ='pushd псевдонима; другая-команда' и затем вызывает 'p2 ~ / temp', поскольку оболочка возвратит ошибку: '-удар: pushd: никакой другой каталог –   29.12.2010, 02:38
  • 4
    Вы могли использовать функцию оболочки: function p2 () { pushd "$@"; other-command;} –  Steven D 29.12.2010, 02:46
  • 5
    сценарий оболочки является прекрасным способом сделать это. Это неэффективно, но это не случай, где оптимизацией стоит обеспокоиться. Определение оболочки функционирует в Вашем ~/.bash_profile (или безотносительно Вашего использования оболочки, если не Bash), будет также работать. Ваш выбор. –  Warren Young 29.12.2010, 05:10

Сценарии не могут изменить среду своего родительского processe. Из-за этого потеряны любые изменения среды, сделанные в сценарии.

Для запущения скрипта в том же процессе можно 'получить' сценарий как это

. /path/to/script.sh args
2
27.01.2020, 20:25

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

Добавьте это в.bashrc:

foo() {
    pushd $1
    time
}
export foo

В оболочке:

$ foo mydir1

выход:

~/mydir1 ~

real    0m0.000s
user    0m0.000s
sys     0m0.000s
0
27.01.2020, 20:25

Теги

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