Вчера я упомянул тему с двойным тире в командах. Чтобы в долгий ящик не откладывать давай разберемся, что это за животное такое и как с ним жить.



Я порой вижу, как опытные админы используют команды в консоли следующим образом:



ssh [email protected] --



Ты наверняка встречал такое и даже применял бездумно, но что означает это двойное тире? Зачем оно? Сейчас покажу на котиках.



Двойное тире означает «флаги командной строки». Оно указывает ssh или другой команде не пытаться анализировать то, что следует после параметров.



Масло масленное. Погнали на практике покажу, теория нам не интересна!



У меня есть такая команда:



ssh [email protected] -- command1 --arg1 --arg2



Приведенный выше синтаксис указывает ssh не пытаться анализировать параметры arg1 и arg2 после символа «--». Это гарантирует, что команда command1 примет arg1 и arg2 в качестве аргументов командной строки и выполнится на удаленном сервере.



Короче говоря мы сообщаем ssh - все то, что идет после двойного тире, это не твои параметры и аргументы, анализировать это НЕ НАДО! СТОП! Дальше дело за command1 и его параметрами и аргументами.



Двойное тире обрабатывается нифига не оболочками bash/zsh/csh/sh/fish и т.п. Оно обрабатывается средствами самих программ, но НЕ всех. Например ssh это умеет делать, как и множество других команд и утилит.



Рассмотрим другие примеры. Например, ты не сможешь просмотреть файл с именем --file или -f используя команду cat. Проверяем:



cat --file

cat -f



Опа. Ошибка! cat: unrecognized option --file/f. Давай теперь передадим двойное тире:



cat -- --file

cat -- -f



Еее! Ошибка пропала и файл успешно вывелся на экран, ну либо выскочило сообщение cat: --file/f: No such file or directory. Это нормально.



Закрепим:



rm --file       = получим ошибку

rm -- '--file' = а вот это сработает



Ну а что бы передать параметры в rm, делаем так:



rm -v -i -- '--file'

rm -f -v -i -- '-f'



Просто, логично, мелодично. Но как я и сказал выше, не все команды умеют работать с двойным тире. Например, команда echo, на все попытки подружить её с двойным тире, просто-напросто провалятся:



/usr/bin/echo -- -n

echo -- --test



выведется это:



-- -n

-- --test



Да и в принципе всё на этом. Важную и полезную тему разобрали, теперь ты знаешь что это за зверюга и как её применять. Ставь лайк, делись с друзьями. Не смею тебя больше отвлекать, пойду дальше дебажить пайплайны. Покеда!





tags: #bash



💩 @bashdays