Я не использую tcsh
и не претендую на статус гуру в нем или любом другом варианте оболочки C. Я также твердо верю, что программирование на Csh считается вредным содержит много правды. ; Я использую оболочку Korn или Bash.
Однако я могу просмотреть справочные страницы и использовал справочную страницу для tcsh (tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-apple-darwin)
в MacOS 10.7.1 Lion).
Насколько я вижу, аналога переменной ${BASH_SOURCE[0]}
в tcsh
нет, поэтому отправная точка для фрагмента скрипта в вопросе отсутствует. Таким образом, если я что-то не упустил в руководстве или оно неполное, нет простого способа добиться такого же результата в tcsh
.
У исходного фрагмента сценария тоже есть некоторые проблемы, как отмечено в комментариях. Если скрипт вызывается с текущим каталогом /home/user1
с использованием имени /usr/local/bin/xyz
, но это символическая ссылка, содержащая ../libexec/someprog/executable
, то фрагмент кода выдаст неправильный ответ (скорее всего, он скажет /home/user1
, потому что каталог /home/libexec/someprog
не существует).
Кроме того, оборачивать цикл while
в цикл if
бессмысленно; код должен просто содержать цикл while
.
SCRIPT_PATH="${BASH_SOURCE[0]}";
while [ -h "${SCRIPT_PATH}" ]; do SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done
Вы должны найти функцию realpath()
; может быть даже команда, использующая его, уже доступная. Конечно, несложно написать команду, которая использует realpath()
. Однако, насколько я могу судить, ни одна из стандартных команд Linux не оборачивает функцию realpath()
, что очень жаль, так как это помогло бы вам решить проблему. (Конкретно команды stat
и readlink
не помогают.)
В самом простом случае вы могли бы написать программу, использующую realpath()
, следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
int rc = EXIT_SUCCESS;
for (int i = 1; i < argc; i++)
{
char *rn = realpath(argv[i], 0);
if (rn != 0)
{
printf("%s\n", rn);
free(rn);
}
else
{
fprintf(stderr, "%s: failed to resolve the path for %s\n%d: %s\n",
argv[0], argv[i], errno, strerror(errno));
rc = EXIT_FAILURE;
}
}
return(rc);
}
Если эта программа называется realpath
, то фрагмент сценария Bash сводится к следующему:
SCRIPT_PATH=$(realpath ${BASH_SOURCE[0]})
person
Jonathan Leffler
schedule
24.08.2011
/home/user1
с использованием имени/usr/local/bin/xyz
, но это символическая ссылка, содержащая../libexec/someprog/executable
, то фрагмент кода выдаст неправильный ответ (скорее всего, он скажет/home/user1
, потому что/home/libexec/someprog/executable
не существует). Оборачивать циклwhile
вif
бессмысленно; код должен просто содержать циклwhile
. Вы должны найти функциюrealpath()
; может быть даже команда, использующая его, уже доступная. Конечно, несложно написать команду, которая используетrealpath()
. - person Jonathan Leffler   schedule 23.08.2011usermod
использовать их, например,bash
. - person carlpett   schedule 23.08.2011