Форум Академгородка, Новосибирск > Как проверить существование symbolic link?
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как проверить существование symbolic link?
Форум Академгородка, Новосибирск > Компьютеры и сети > Операционные системы > Unix
Nox Metus
.
fiend
CODE
  if [[ -L somelink ]]; then
    rm somelink
  fi

Из фильма
И правда странно:

-L file True if file exists and is a symbolic link.
-h file True if file exists and is a symbolic link.

В чем отличие-то?
fiend
По всей видимости, странная недокументированная особенность GNU coreutils test и Bash (имеет смысл посмотреть исходники).

В других OS (или shell) поведение ключей -h/-L у `test` (или у [/[[) скорее всего идентично.
Из фильма
Цитата(Nox Metus @ 24.12.2010, 18:33) *
Цитата(Из фильма @ 24.12.2010, 15:48) *
В чем отличие-то?
Из первого поста разве непонятно? -h выдаст false, если линк есть, а того, на что он указывает нет, -L выдаст в том же случе true.

Я спрашивал про описание в мане, если непонятно.
fiend
Магия лол.

Bash 4.1 test.c:
CODE
    case 'L':            /* Same as -h  */
    case 'h':            /* File is a symbolic link? */
#if !defined (S_ISLNK) || !defined (HAVE_LSTAT)
      return (FALSE);
#else
      return ((arg[0] != '\0') &&
          (lstat (arg, &stat_buf) == 0) && S_ISLNK (stat_buf.st_mode));


Coreutils 8.5 test.c:
CODE
    case 'L':            /* Same as -h  */
      /*FALLTHROUGH*/

    case 'h':            /* File is a symbolic link? */
      unary_advance ();
      return (lstat (argv[pos - 1], &stat_buf) == 0
              && S_ISLNK (stat_buf.st_mode));


В патчах Debian тоже ничего huh.gif
Может я где-то не там смотрю?
fiend
QUOTE(Nox Metus @ 24.12.2010, 19:11) *
Ээээ... [[ — это же встроенная команда, а не test.

В bash и [ и test - один и тот же builtin; а [[ - уже keyword.
В coreutils test я для сравнения заглянул.

Вопрос в другом - пока не смог найти в исходниках bash, что получается при разборе extended condition ([[) для унарных тестов, и чем это отличается от test ([)?

Скорее всего [[ разворачивается в вызовы builtin test (по крайней мере, S_ISLNK на это тему встречается только в test.c buildin'а).
milfoil
Цитата(Nox Metus @ 24.12.2010, 11:30) *
Есть код:
Код
  if [[ -h somelink ]]; then
    rm somelink
  fi
Проблема в том, что если директория, на которую указывает somelink не существует, то -h somelink выдаёт false. Как быть?


У меня выдаёт true. GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu). Debian.
fiend
QUOTE(Nox Metus @ 26.12.2010, 20:50) *
Но мамой клянусь...

Практически аналогично, на "старых" линках `if [[ -h|L ... ]]` - true, а если в скрипте подряд `mkdir bar; ln -s bar foo; rm -rf bar; if [[ -h|L foo ]]` - false ohmy.gif

CODE
$ uname -srv
Linux 2.6.32-5-amd64 #1 SMP Sat Oct 30 14:18:21 UTC 2010
$ cat /etc/debian_version
squeeze/sid
$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.