Как я могу получить имя исходного сценария в tcsh?

#linux #unix #tcsh

Вопрос:

Я ищу способ получить имя сценария, который был получен из другого сценария, выполняемого в tcsh.

Если бы мне нужно было указать имя выполняемого сценария (без источника), это так $0 . Если мне нужно получить имя сценария, получаемого из командной строки, я могу получить его из $_ . Но когда выполняемый сценарий создает сценарий, я получаю пустое значение для исходного $_ сценария, поэтому я не могу получить из него имя или путь к сценарию.

Я ищу не ручной метод получения этой информации.

Ответ №1:

На самом деле для этого нет ничего; source в основном это просто способ прочитать файл и запустить его в текущей области.

Тем не менее, он принимает аргументы; со страницы tcsh руководства:

    source [-h] name [args ...]
           The shell reads and executes commands from name.  The commands
           are not placed on the history list.  If any args are given,
           they are placed in argv.  ( ) source commands may be nested; if
           they are nested too deeply the shell may run out of file
           descriptors.  An error in a source at any level terminates all
           nested source commands.  With -h, commands are placed on the
           history list instead of being executed, much like `history -L'.
 

Так, например source file.csh file.csh , придется argv[1] установить на file.csh .

Другой вариант-просто установить переменную перед source командой:

 set src = "file.csh"  # Will be available in file.csh
source file.csh
 

Если вы не можете или не хотите изменять source вызов, то, насколько я знаю, вам не повезло. (t)csh-это старая жесткая оболочка со многими неудобными вещами, большими и маленькими, и я бы вообще не рекомендовал использовать ее для написания сценариев, если у вас действительно нет доступных опций.

$_ просто получает последнюю командную строку из истории; может быть, очень может быть, можно придумать супер-хакерское решение (ab)использовать историю для этого каким-то образом, но мне кажется, что просто ввести имя файла дважды намного проще.