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

11

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

而我的当前目录是任意的,例如我在 /path 中

那么我输入 to/my_script.csh

我想要在 my_script.csh 中有一行代码能够返回 "/path/to/my_script.csh",就像 ruby 的

__FILE__
4个回答

11

在C Shell中,可以尝试以下操作:

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

不幸的是,当我在我的#!/bin/csh脚本中这样做,并使用相对路径(./myscript.csh)运行它时,它总是返回我的主目录。无论我把这个脚本放在哪里。dirname $0是'.',而pwd返回我的$HOME。 - mdiehl13
@mdiehl13,你描述的问题我没有遇到过。你还能看到同样的问题吗?你可能需要检查你的.cshrc文件,看看是否有任何与目录路径设置相关的特殊配置。 - euccas
@euccas 不,很奇怪(而且很好)。我不再看到这种行为了。 - mdiehl13

6
如果您想要绝对路径,则可以尝试以下方法:
#!/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/

如何获取CSH / TCSH脚本的路径名?
在csh或Tcsh中,有一个内置变量$0,它包含当前脚本或命令的名称和路径。使用dirname命令,可以将其转换为只包含路径的字符串。
下面是示例代码:
``` #!/bin/csh
set SCRIPT_PATH = `dirname $0`
echo "Script path is: $SCRIPT_PATH" ```
此代码将打印出当前脚本的路径名。

1
感谢您帮我解决了如何区分源代码和调用脚本的问题,省去了更多的挫败感。 - SunDontShine
这样做可以得到正确的结果,如果是手动获取的话,但如果是由另一个脚本获取的话就不行了。有没有一种方法,在这种情况下也能正常工作呢? - M0M0

6
如果您想确保相同的结果(完整路径和脚本名称),请尝试以下内容:
...
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等方式调用,无论如何调用都会得到相同的结果。


4
错误的命令行壳 -_- - user234461

1
#!/bin/tcsh
echo "I am $0."

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接