Найденный в ранних источниках Unix:
/*
* You are not expected to understand this.
*/
if(rp->p_flag & SSWAP) {
rp->p_flag =& ~SSWAP;
aretu(u.u_ssav);
}
(Слегка отредактированный.)
Сценарий оболочки обычно выполняется в отдельном экземпляре программной оболочки, /bin/sh
в этом случае. Ваш pushd
управляйте влияет на рабочий каталог той подоболочки только. Если бы это было иначе, то любая программа, которую Вы запустили от оболочки, могла бы смешать с рабочим каталогом Вашей оболочки.
Для выполнения того сценария в текущей оболочке скажите это вместо этого:
$ . my-command somedir
или, больше verbosely:
$ source my-command somedir
Чтобы заставить ее появиться, что Ваша программа работает как любой другой, можно использовать псевдоним:
$ alias mycmd='source my-command'
$ mycmd /bin
$ pwd
/bin
Сценарии не могут изменить среду своего родительского processe. Из-за этого потеряны любые изменения среды, сделанные в сценарии.
Для запущения скрипта в том же процессе можно 'получить' сценарий как это
. /path/to/script.sh args
Вместо сценария оболочки для такого рода операций больше подходит функция, особенно при использовании pushd.
Добавьте это в.bashrc
:
foo() {
pushd $1
time
}
export foo
В оболочке:
$ foo mydir1
выход:
~/mydir1 ~
real 0m0.000s
user 0m0.000s
sys 0m0.000s
pushd <params>; other-command
– Shawn J. Goff 29.12.2010, 02:26function p2 () { pushd "$@"; other-command;}
– Steven D 29.12.2010, 02:46~/.bash_profile
(или безотносительно Вашего использования оболочки, если не Bash), будет также работать. Ваш выбор. – Warren Young 29.12.2010, 05:10