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

如何在bash脚本中运行cd(在子shell之外),bash,shell,tcsh,Bash,Shell,Tcsh,我正在编写一个bash脚本(称为gotodir.sh),并希望在脚本编写过程中根据一些变量更改目录,例如cd/home/username/${FOO}/${BAR} 当进程退出时,只按原样运行是不起作用的,因为目录仅在子shell中更改 我的壳是tcsh。(是的,我知道……这里不是我的选择。)在我的.cshrc文件中,我想将关键字gotodir别名为gotodir.sh 我已经了解到,使用或源代码前缀执行脚本将导致脚本在同一shell中运行(即,不是子shell) 我已尝试将以下内容放入.csh

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

当进程退出时,只按原样运行是不起作用的,因为目录仅在子shell中更改

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

我已经了解到,使用
源代码
前缀执行脚本将导致脚本在同一shell中运行(即,不是子shell)

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

但这会导致错误:
/bin/:权限被拒绝。

我还尝试使用
源代码
而不是

alias gotodir source /home/username/bin/gotodir.sh
但这会导致错误:
if:Expression语法。


如何在运行tcsh时使用bash脚本实现这一点?

当您从tcsh运行文件时,tcsh将运行命令。
#
作为注释被忽略,因为您不是以脚本的形式运行文件,而是从中读取命令,就像它们是在shell提示下输入的一样

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

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

alias gotodir 'cd `/blah/blah/thescript`'
附录

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

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

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

您有
#/bin/bash
并对脚本执行权限
chmod+x/home/username/bin/gotodir.sh
?@keepcalmand carryon Yes和Yes。不幸的是,解决问题并不那么容易(有趣的概念。所以脚本应该返回路径?在bash中如何执行?只需将脚本中的
cd
替换为
echo
,如果脚本打印出其他信息呢?现在它打印出错误消息并轮询输入。如果您使用
1>&2
打印错误消息,那么它们将转到st。)derr,这很好。stdin的输入应该仍然有效。只有脚本的stdout会被捕获并用于
cd
的目标。不幸的是,脚本需要一个参数。有没有办法集成它?比如,
别名gotodir cd`/blah/blah/thescript$1`
alias gotodir 'cd `/blah/blah/thescript \!:1`'