如何找到我正在执行的 tcsh shell 脚本的位置?

Posted

技术标签:

【中文标题】如何找到我正在执行的 tcsh shell 脚本的位置?【英文标题】:How can I find the location of the tcsh shell script I'm executing? 【发布时间】:2011-02-03 12:47:18 【问题描述】:

假设我将一个可执行的 tcsh 文件放在 /path/to/my_script.csh 中

我的当前目录在任何地方,例如我在 /path

所以我输入到/my_script.csh

我想在 my_script.csh 中有一行返回 "/path/to/my_script.csh" - 就像 ruby​​ 的

__FILE__

【问题讨论】:

【参考方案1】:

在 c shell 中,试试这样:

set rootdir = `dirname $0`
set abs_rootdir = `cd $rootdir && pwd`
echo $abs_rootdir

【讨论】:

不幸的是,当我在我的 #!/bin/csh 脚本中执行此操作并使用相对路径 (./myscript.csh) 运行它时,它总是返回我的主目录。我把这个脚本放在哪里都没关系。 dirname $0 是“。” pwd 返回我的 $HOME @mdiehl13 你描述的问题没有发生在我身上。你还看到同样的问题吗?您可能需要检查您的 .cshrc 文件,看看是否有与目录路径设置相关的特殊配置。 @euccas 不,奇怪(而且很好)。我不再看到这种行为了【参考方案2】:

如果您想确保相同的结果(完整路径和脚本名称),请尝试以下操作:

...
rootdir=`/bin/dirname $0`       # may be relative path
rootdir=`cd $rootdir && pwd`    # ensure absolute path
zero=$rootdir/`/bin/basename $0`
echo $zero
...

然后你可以调用它为 foo.sh, ./foo.sh, some/lower/dir/foo.sh 并且无论怎么调用它仍然得到相同的结果。

【讨论】:

错误的外壳-_-【参考方案3】:

如果你想要一个绝对路径,那么这应该可以帮助你:

#!/bin/tcsh -f 
set called=($_)

if ( "$called" != "" ) then  ### called by source 
   echo "branch 1"
   set script_fn=`readlink -f $called[2]`
else                         ### called by direct execution of the script
   echo "branch 2"
   set script_fn=`readlink -f $0`
endif

echo "A:$0"
echo "B:$called"
set script_dir=`dirname $script_fn`

echo "script file name=$script_fn"
echo "script dir=$script_dir"

来源:http://tipsarea.com/2013/04/11/how-to-get-the-script-path-name-in-cshtcsh/

【讨论】:

感谢您让我对如何区分源脚本和调用脚本不再感到沮丧【参考方案4】:
#!/bin/tcsh
echo "I am $0."

【讨论】:

这给出了从当前目录到脚本的路径,而不是绝对路径。

以上是关于如何找到我正在执行的 tcsh shell 脚本的位置?的主要内容,如果未能解决你的问题,请参考以下文章

Linux下如何执行Shell脚本

在linux系统内,如何将一个shell脚本添加到自动启动项?

linuxshell 脚本执行的过程是怎样的?

bash与sh的问题

shell学习心得

如何在 tcsh Shell 中检查变量是不是为空?