Короткий короткий фон:
На жаль, API Unix не забезпечує запущену програму з повним шляхом до виконуваного файлу. Насправді програма, що виконує вашу, може надати все, що вона хоче, у полі, яке зазвичай повідомляє вашій програмі, що це таке. Як вказують усі відповіді, є різні евристики для пошуку ймовірних кандидатів. Але нічого, крім пошуку всієї файлової системи, завжди буде працювати, і навіть це не вдасться, якщо виконуваний файл буде переміщений або видалений.
Але ви не хочете виконувати виконуваний Perl, який саме працює, але сценарій, який він виконує. І Перл повинен знати, де сценарій, щоб його знайти. Він зберігає це в __FILE__
, поки $0
є від Unix API. Це все ще може бути відносним шляхом, тому прийміть пропозицію Марка і канонізуйте йогоFile::Spec->rel2abs( __FILE__ );