如何在bash脚本中运行cd(在子shell之外)

时间:2013-07-19 00:29:35

标签: bash shell tcsh

我正在编写一个bash脚本(名为 gotodir.sh ),并希望在脚本过程中更改目录,具体取决于某些变量,例如cd /home/username/${FOO}/${BAR}

当进程退出时,只是按原样运行它,因为目录仅在子shell中更改。

我的shell是tcsh。 (是的,我知道......不是我的选择。)在我的 .cshrc 文件中,我想将关键字 gotodir 别名为 gotodir.sh

我已经读过,使用.source前缀执行脚本会导致脚本在同一个shell中运行(即不是子shell)。

我已尝试将以下内容放入 .cshrc 文件中:

alias gotodir . /home/username/bin/gotodir.sh

但这会导致错误:/bin/.: Permission denied.

我还尝试使用source代替.

alias gotodir source /home/username/bin/gotodir.sh

但这会导致错误:if: Expression Syntax.

如何在运行tcsh时使用bash脚本完成此操作?

1 个答案:

答案 0 :(得分:3)

当您从tcsh source文件时,tcsh运行命令。 #!被忽略为注释,因为您没有将该文件作为脚本运行,只是从它中读取命令,就像它们是在shell提示符下输入一样。

你的任务注定要失败。只有tcsh cd命令才能更改tcsh进程的当前目录。

但是如果你愿意弯曲一下,你可以编写一个作为单独进程运行的脚本,并将目录名称输出到cd。然后设置像

这样的别名
alias gotodir 'cd `/blah/blah/thescript`'

<强>附录

添加参数是可能的,但很棘手。别名参数看起来像历史扩展,!:1扩展到第一个参数。但引号不保护!字符。您必须反斜杠以防止在创建别名期间扩展它,因此它可以在执行别名期间完成其工作。

alias gotodir 'cd `/blah/blah/thescript \!:1`'

可能需要额外引用来处理带有空格的参数和目录。