Строка хижины с '#!/usr/bin/env команда - аргумент' перестала работать на Linux

GNU coreutils руководство дает некоторые примеры приложений, такие как сворачивание нескольких новых строк в одну (tr -s '\n') или помещение каждого слова на его собственной строке при удалении пунктуации одновременно (tr -cs '[:alnum:]' '[\n*]').

55
07.02.2013, 01:03
2 ответа

Похож это вызвано тем, что Linux (в отличие от BSD) только передает отдельный аргумент команде хижины (в этом ENV случая).

Это было экстенсивно обсуждено на StackOverflow.

47
27.01.2020, 19:33
  • 1
    видит также эту страницу для обзора поведения на различных Нельдах. –  Stéphane Chazelas 06.02.2013, 22:46
  • 2
    . Мой бог. –  Konrad Rudolph 04.12.2014, 19:09
  • 3
    Если "спецификацией перестали работать", Вы подразумеваете, что все системы Unix должны принять больше чем 1 аргумент, то я, 100% согласовывают с Вами :) –  Alexander Mills 25.03.2017, 02:01

Обнаружено через комментарий @rampion:

Что происходит, так это то, что ядро ​​обрабатывает первый два символа файла, ищущего # !. Если они найдены, он пропускает все символы пробела , ища непробельный символ, и извлекает путь интерпретатора , который должен быть реальным исполняемым файлом, а не другим скриптом , хотя linux расширяет это, чтобы разрешить рекурсивную обработку скрипта . Обнаружив, что затем он переходит к первому непробельному символу , откуда переходит к следующему символу новой строки, а передает его как один аргумент команде. Нет никакой "оболочки" обработки кавычек или других метасимволов. Это все очень просто и грубо. Поэтому вы не можете вникнуть в там с параметрами. Вы получаете ровно один аргумент, включающий пробел, и 'perl -w' - это то, что ядро ​​видит здесь и передает дальше.

Источник: http://lists.gnu.org/archive/html/bug-sh-utils/2002-04/msg00020.html

5
27.01.2020, 19:33

Теги

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