Возможное объяснение тайны :
У вас есть программа с именем pwd
в пути поиска команд (т.е. в одном из каталогов, названных переменной среды PATH), которыеделает эти странные вещи.При выполнении pwd
в интерактивной оболочке (bash) или в сценарии оболочки (dash) вы получаете команду buildin pwd
, которая печатает текущий рабочий каталог, как и должно быть.
С другой стороныВ вашей исходной строке Perl
$directory=`pwd`;
Perl не вызывает системную оболочку с помощью функции C system()
, а вместо этого напрямую выполняет команду pwd
в пути (используя execvp()
вызов в разветвленном процессе), поскольку команда выглядит достаточно простой ( простая команда , в терминологии bash).Если этот pwd
двоичный файл не является обычным /bin/pwd
двоичным файлом (который также просто печатает текущий каталог), а вместо этого выполняет что-то вроде ls -l
, мы получаем наблюдаемое поведение.
РеальноеРешение было бы исправить вашу PATH и / или удалить поддельный pwd
двоичный файл.Используйте which pwd
, чтобы узнать, где он находится (или type -a pwd
на bash).
Решение со стороны Perl состоит в том, чтобы вызвать вызов оболочки:
$directory=`pwd;`;
Это заставляет Perl вызывать оболочку вместо непосредственного выполнения программы.(В целом, любой метасимвол оболочки имеет такой эффект. Это описано только для системной функции Perl , а не для оператора quote-execute .)
В этом случае Perl будет вызывать /bin/sh
, который в Ubuntu (по крайней мере в текущих версиях, я не уверен насчет вашего 9.10) равен dash
(оболочка Debian Almquist) вместо bash
(GNU's Bourne Again)Ракушка).Dash - намного более простая (и более быстрая) реализация sh
, чем bash, но для таких вещей, как pwd
, не должно быть никакой разницы (это тоже встроенная функция в моем dash), если у вас нет псевдонимов или функций оболочкиопределяется в одной оболочке, а не в другой.
Конечно, лучшим решением будет использование модуля Perl Cwd , как рекомендуется в ответеtoolic .
Благодарю ikegami за объяснение мне семантики оператора backticks в комментариях к вопросу.