если файл является ссылкой на ОС Linux - PullRequest
3 голосов
/ 01 апреля 2009

Я пытаюсь проверить, существует ли символическая ссылка из скрипта KornShell (ksh) с помощью команды "-h filename" Это хорошо работает на боксах HP.

Не уверен, что является правильным вариантом для Linux, AIX и Solaris.

Есть идеи по этому поводу?

Ответы [ 4 ]

6 голосов
/ 03 апреля 2009

-h является частью спецификации POSIX ; оно должно работать везде, что является разумно разумным.

Согласно man test в Mac OS X:

     -h file       True if file exists and is a symbolic link.  This operator
                   is retained for compatibility with previous versions of
                   this program. Do not rely on its existence; use -L instead.

-L также стандартизирован, поэтому, если вы обнаружите, что -h не работает, вы должны попробовать -L.

5 голосов
/ 01 апреля 2009

Это также -h в системах linux, по крайней мере (bash - моя оболочка):

lrwxrwxrwx 1 mule mule 37 Feb 27 09:43 mule.log -> /home/mule/runtime/mule/logs/mule.log
[mule@emdlcis01 ~]$ if [[ -h mule.log ]]; then echo "mule.log is a symlink that exists" ; fi
mule.log is a symlink that exists

Установите флажок man test, чтобы увидеть доступных операторов, которые вы можете использовать для файлов и строк в данной среде.

1 голос
/ 02 апреля 2009

Лучший ответ - попробовать то, что написано в справочной странице «test» в вашей системе. Если это похоже на работу, не смотрите дальше. Однако, если кажется, что он не работает или у вас есть вопросы о более непонятных опциях для тестирования, вам также следует проверить страницу руководства для вашей оболочки, чтобы увидеть, являются ли 'expr' или '[' встроенными. В этом случае оболочка может использовать внутреннюю реализацию вместо вызова утилиты expr из / bin. На Солярисе я проверил, что ksh93 рассматривает [как встроенный файл (хотя страница руководства, похоже, так не говорит). Из вывода фермы вы можете видеть, что ksh не запускает команду expr для [.

% truss -f -texec /bin/ksh '[ -h /home ]'
26056:  execve("/usr/bin/ksh", 0x08047708, 0x08047714)  argc = 2
26056:  execve("/usr/bin/ksh93", 0x08047708, 0x08047714)  argc = 2
26056:  execve("/usr/bin/amd64/ksh93", 0x08047704, 0x08047710)  argc = 2

% truss -f -texec /bin/ksh '/bin/expr -h /home ]'
26058:  execve("/usr/bin/ksh", 0x08047700, 0x0804770C)  argc = 2
26058:  execve("/usr/bin/ksh93", 0x08047700, 0x0804770C)  argc = 2
26058:  execve("/usr/bin/amd64/ksh93", 0x080476FC, 0x08047708)  argc = 2
26058:  execve("/bin/expr", 0x00418360, 0x00418398)  argc = 4
0 голосов
/ 07 декабря 2009

Два возможных варианта:

    if [ -h filename ] 
OR
    ls -ltr | grep filename | grep ^l

Если $? 0, тогда файл связан, иначе он не связан, вместо этого я предпочту первый вариант.

...