ФорумРазработкаУстановка и администрирование ПОИнтерпретаторы, компиляторы и т.д. → bash: аргументы командной строки и ковычечки

bash: аргументы командной строки и ковычечки

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 0:24

    Реквестую знатаков баша.

    Есть скрипт, предположим, на PHP:

    <?php
    print_r($_SERVER['argv']);
    

    Выводит аргументы командной строки.

    Запускаем:

    $ php -f script.php -- --message="This is message" arg
    Array
    (
        [0] => script.php
        [1] => --message=This is message
        [2] => arg
    )
    

    Парсер аргументов как и надо распознал, что сообщение в кавычках и не стал рубить опцию по пробелам (правда кавычки выкинул).

    Теперь скрипт на баше, который вызывает скрипт на PHP c теми аргументами, которые ему переданы:

    #!/bin/bash
    
    echo "php -f script.php -- $@"
    
    php -f script.php -- $@
    

    Запускаем:

    php -f script.php -- --message=This is message arg
    Array
    (
        [0] => script.php
        [1] => --message=This
        [2] => is
        [3] => message
        [4] => arg
    )
    

    Херня. Баш вырезал кавычки и --message распалось на 3 аргумента.

    Как это победить?

    Перебирать все аргументы, заключать целиком в кавычки и формировать исполняемую команду?

    Спустя 121 сек.

    Ёбаные эмоджи, которые лезут во все щели, стоит только набрать двоеточие начинают раздражать.

    Эмоджам место на Unicode-Zeichentabelle [unicode-table.com]
    Unicode Table - лучший сайт по теме эмоджи в Санкт-Петербурге.

    Спустя 148 сек.

    Резюмирую: "$@" не содержит кавычек. Что делать?

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 1:22, спустя 57 минут 25 секунд

    @vasa_c, ты наверное удивишься, но "$@" отлично справляется с этой задачей. Видимо "магия" :)

    Спустя 59 сек.

    сat test.sh
    echo "$@"
    
    #/test.sh 1 2 3      4
    1 2 3 4
    
    #/test.sh 1 2 "3      4"
    1 2 3     4
    
    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 1:24, спустя 2 минуты 27 секунд

    Почему у меня не справляется?

    Даже уберём страшное слово "PHP" и сведём к простейшему:

    #!/bin/bash
    echo $@
    

    -

    $ ./script.sh a b "c d"
    a b c d
    

    Спустя 62 сек.

    #/test.sh 1 2 "3      4"
    1 2 3     4
    

    Да, по выводу никак нельзя определить, что 3 и 4 раньше были в одном аргументе

    Спустя 8 сек.

    @phpdude,

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 1:45, спустя 21 минуту 4 секунды

    @vasa_c, так а в кавычки то $@ ты не заключил в твоем примере, а нужно! :)

    Спустя 68 сек.

    мне влом проверить, но я полагаю что "$@" это не аргументы, а как в пхп типа QUERY_STRING в сыром виде, без обработки башем их. Можно проверить послав пробелы между "аргументами", но влом писать кодус для тест

    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 1:48, спустя 2 минуты 39 секунд

    но влом писать кодус для тест

    так ты же уже написал.

    у тебя на входе

    1 2 "3 4"

    а на выходе

    1 2 3 4

    что концептуально совсем другое.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 1:51, спустя 2 минуты 51 секунду

    так ты же уже написал.

    @vasa_c, нет, не то я имел ввиду под тестом, например запустить не echo, а питон условно и принтануть command line оттуда, чтобы поглядеть в каком виде передается.

    у тебя заработало? я не понял

    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 1:58, спустя 7 минут 25 секунд

    передаётся без кавычек.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 2:07, спустя 8 минут 44 секунды

    передаётся без кавычек.

    @vasa_c, покажи свой пример

    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 3:33, спустя 1 час 25 минут 57 секунд

    @phpdude,

    #!/bin/bash
    
    echo $@
    echo "$@"
    echo $*
    echo "$*"
    

    -

    $ ./script.sh a "b c" d
    a b c d
    a b c d
    a b c d
    a b c d
    
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 3:37, спустя 4 минуты 31 секунду

    @vasa_c, у меня все пашед отлично

    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 3:50, спустя 12 минут 56 секунд

    @phpdude, как же отлично? у тебя в выводе нет ковычечек.
    если эту строку передать дальше, то b и c будут считаться разными аргументами.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 3:55, спустя 4 минуты 13 секунд

    @phpdude, как же отлично? у тебя в выводе нет ковычечек.
    если эту строку передать дальше, то b и c будут считаться разными аргументами.

    @vasa_c, блеядь! так это echo кавычки не выводит. зоебал, щас тест напейшу

    Сапожник без сапог
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 4:10, спустя 15 минут 22 секунды

    хуй, нельзя получить raw command line в линупсе. Get the complete command line as-is - Python [bytes.com]

    под форточками только, так что я сливаюсь чтото доказывать

    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 6:07, спустя 1 час 57 минут 14 секунд

    окай, реквестуются ещё знатоки баша.

    как тогда перебрать в цикле все аргументы, заключить их все в кавычки и сформировать новую командную строку

    то есть на входе

    a "b c" d
    

    список аргументов:

    a
    b c
    d
    

    перебираем и лепим их в:

    "a" "b c" "d"
    

    по идее должно в три аргумента распарсится.

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 21 октября 2015 г. 6:09, спустя 1 минуту 31 секунду

    @vasa_c, ты что-то недопонял либо делаешь не так

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!