запустите скрипт жемчуга с неизвестным местоположением жемчуга

.. запись каталога в текущем каталоге. Это - hardlink к каталогу, который каждый выравнивает. /base/symlink/.. на самом деле тот же файл как /some_other_dir/.., и это / (если some_other_dir самостоятельно также символьная ссылка на где-то в другом месте).

В большинстве оболочек, cd обработки .. особенно, это вместо того, чтобы рассматривать его как .. запись каталога, случаи .. интерпретируются cd (а не разрешением пути системы) как удаление одного уровня каталога.

Как пример, в cd a/b/.., оболочка делает a chdir("a") вместо того, чтобы делать a chdir("a/b/.."). Для получения последнего необходимо сделать cd -P a/b/...

Важно понять, что это только относится cd (и только в некоторых оболочках), (IMO, ошибка), не к ls или vi или что-либо еще (если это что-либо еще не сценарий, записанный с теми оболочками).

В тех оболочках, где cd делает ту логическую интерпретацию .., pwd встроенный и $PWD переменная содержит логический текущий каталог вместо реального (физического), который является один с возможно компонентами каталога символьной ссылки. Точно так же можно использовать pwd -P получить физический рабочий каталог.

Теперь, если Вы хотите сделать

cd /A/b
anything-but-cd ../c

И на самом деле средний:

anything-but-cd /A/c

Независимо от ли /A/b если бы символьная ссылка был или не, то Вы могли сделать вместо этого:

anything-but-cd "$(dirname -- "$PWD")/c"

или

anything-but-cd "${PWD%/*}/c"
5
05.02.2014, 21:50
2 ответа

Или, Вы можете иметь sh заботьтесь о нем для Вас:

 #!/bin/sh
 exec perl -x "$0" "$@"

 #!/usr/bin/perl
 ...

Да, это sh и Perl все в одном файле.

От man perlrun:

- x
говорит Perl, что программа встраивается в больший блок несвязанного текста, такой как в сообщении электронной почты. Ведущий мусор будет отброшен до первой строки, которая запускается с "#!" и содержит строку "perl". Будут применены любые значимые переключатели на той строке.

Этот подход только принимает путь sh (который должен быть тем же на любой совместимой POSIX ОС), и что неинтерактивный экземпляр sh имеет perl где-нибудь в PATH.

Что касается обеспечения сценария имеет исполняемый набор битов, можно всегда распределять его как tarball и иметь пользователей "щелчок правой кнопкой, извлечение здесь" из GUI. Если бы tarball содержал сценарий с исполняемым набором битов, то извлеченный сценарий должен иметь исполняемый набор битов.

7
27.01.2020, 20:33
  • 1
    Обратите внимание, что POSIX не указывает путь sh. /bin/sh может также быть Оболочка Bourne (не на OS/X, хотя), где тот синтаксис должен также работать кроме очень старых версий, где Вам нужно ${1+"$@"} вместо "$@" (${1+"$@"} будет также работать в оболочках POSIX, но не в некоторых старых версиях zsh (/bin/sh был zsh на OS/X в какой-то момент)). –  Stéphane Chazelas 07.02.2014, 15:46
  • 2
    @StephaneChazelas "POSIX не указывает путь sh". Это очень странно. Спасибо за информацию, все же. –  Joseph R. 07.02.2014, 23:19

Для строки хижины используйте:

#!/usr/bin/env perl

env будет искать ПУТЬ в выполняют первое perl то, что это находит. Если Вы хотите указать какие-либо опции для жемчуга, просто добавьте их в конец строки выше.

Если больше чем один perl установлен, env выполнит первый, который это находит в ПУТИ.

6
27.01.2020, 20:33

Теги

Похожие вопросы