Как я могу найти местоположение сценария оболочки tcsh, который я выполняю?

Скажем, я поместил исполняемый файл tcsh в /path/to/my_script.csh

и мой текущий каталог находится где угодно, например, я в /path

Поэтому я набираю /my_script.csh

Я хочу иметь строку в my_script.csh, которая будет возвращать "/path/to/my_script.csh" - как в ruby

__FILE__

person Julian Mann    schedule 01.04.2010    source источник


Ответы (4)


В оболочке c попробуйте так:

set rootdir = `dirname $0`
set abs_rootdir = `cd $rootdir && pwd`
echo $abs_rootdir
person euccas    schedule 24.07.2014
comment
К сожалению, когда я делаю это в своем сценарии #!/bin/csh и запускаю его с относительным путем (./myscript.csh), он всегда возвращает мой домашний каталог. Неважно, куда я положил этот скрипт. dirname $0 это '.' и pwd возвращает мой $HOME - person mdiehl13; 10.03.2016
comment
@ mdiehl13 mdiehl13 Проблема, которую вы описали, у меня не возникает. Вы все еще видите ту же проблему? Возможно, вам потребуется проверить файл .cshrc и посмотреть, есть ли какие-либо специальные конфигурации, связанные с настройкой пути к каталогу. - person euccas; 08.03.2018
comment
@euccas Нет, странно (и хорошо). я больше не вижу такого поведения - person mdiehl13; 09.03.2018

Если вы хотите получить тот же результат (полный путь и имя скрипта), попробуйте что-то вроде этого:

...
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 и получить тот же результат независимо от того, как он называется.

person DAS    schedule 04.01.2012
comment
Неправильная оболочка -_- - person user234461; 18.06.2018

Если вам нужен абсолютный путь, это должно вам помочь:

#!/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/

person Lewis R    schedule 10.07.2017
comment
Спасибо, что избавили меня от дальнейших разочарований в том, как отличить источник от вызывающего скрипта. - person SunDontShine; 21.01.2020

person    schedule
comment
Это дает путь от текущего каталога к сценарию, а не абсолютный путь. - person supergra; 27.08.2018