【问题标题】:How can I find the location of the tcsh shell script I'm executing?如何找到我正在执行的 tcsh shell 脚本的位置?
【发布时间】: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__

【问题讨论】:

    标签: path shell directory tcsh


    【解决方案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."
    

    【讨论】:

    • 这给出了从当前目录到脚本的路径,而不是绝对路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多