Я ищу файл под tcsh. Этот файл может быть где угодно в файловой системе. Как я могу получить путь к исходному файлу?
$ 0 не сработает: я не выполнять файл, я источник Это.
Большое спасибо !
Если вы не хотите использовать lsof
, используйте ниже только для csh.
set script_path = `ls -l /proc/$$/fd | sed -e 's/^[^/]*//' | grep "/script_name"`
$$
это pid текущего запущенного потока.
Независимо от того, какой метод (полученный пользователем или в другом сценарии) вызывается, сценарий также открывается. Таким образом, фильтруя содержимое fd, вы получите реальный путь к скрипту.
Это также работает, когда скрипт мягко связан с другим путем!
Немного grepping дает мне то, что я хочу.
Одно я знаю точно: базовое имя файла (а не весь путь). В моем случае source_me.tcsh. Таким образом, мы можем запросить lsof для текущего PID оболочки и grep абсолютный путь.
$$ дает вам PID.
/usr/sbin/lsof +p $$ | grep -oE /.\*source_me.tcsh
Вы можете попробовать следующее, что должно работать в обычном (t) csh. Я не знаю, работает ли это также в. (T) cshrc:
#!/bin/csh
set DUS = ( $_ ) #DUS: Dollar UnderScore
set DNU = $0:q #DNU: Dollar NUll
if (( $#DUS > 1 )) then
if ("${DUS[1]}" == 'source' || "$DNU:t" == 'tcsh' || "$DNU:t" == 'csh') then
set DNU = ${DUS[2]:q}
endif
endif
echo 'Your script path is: '`(cd "$DNU:h" >&! /dev/null; pwd)`
echo 'your script name is: '$DNU:t
Насколько я знаю, поиск означает, что вы запускаете его как если бы вы вводили команды одну за другой в командной строке. Тогда, конечно, вы не сможете получить доступ к его имени, потому что он изначально не выполняется как скрипт.
Но может вам повезет: попробуйте посмотреть в журнале команд. В bash
вы просто набираете "history
", не знаю о tcsh
но я думаю, что там тоже должен быть один.
Хотя это возможно в другие снаряды, Я не вижу способа сделать это в tcsh
.