如何在bash脚本中运行cd(在子shell之外)
我正在编写一个bash脚本(称为gotodir.sh),并希望在脚本编写过程中根据一些变量更改目录,例如如何在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
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提示下输入的一样
你的任务注定要失败。只有tcshcd
命令才能更改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`'