Как безопасно записать содержимое неизвестной переменной оболочки в стандартный вывод - PullRequest
0 голосов
/ 22 декабря 2018

Я знаю только то, что прочитал до сих пор, и меня смущает, как на самом деле отобразить переменную как есть.

  • echo "$var" может завершиться ошибкой, если var='-n'
  • printf '%s\n' "$var" может завершиться с ошибкой из-за того, что оболочка не реализована printf
  • echo -- "$var" может завершиться сбоем из-за того, что это расширение GNU

Так что, если бы мне пришлось угадывать:

echo x"$var"|sed 's#^x##1' было бы единственным способом, но я никогда не сталкивался с таким паттерном.Почему?


В качестве конкретного вопроса:

for source; do
  target="$(echo "$source"|sed 's#[^a-z0-9]\+#.#')"
  # do stuff with $source and $target
done

Работает ли это, или кто-то может "взломать" / "сломать" мой скрипт, поместив файл с именем '-n'где-то, предполагая, что мой скрипт выполняется каким-то my_script * cron?

Как мне написать echo "$var", чтобы он не ломался?

1 Ответ

0 голосов
/ 22 декабря 2018

Это работает, или кто-то может "взломать" / "сломать" мой скрипт, поместив куда-нибудь файл с именем '-n'?

В этом нет ничего плохого:

target="$(echo "$source"|sed 's#[^a-z0-9]\+#.#')"

Что происходит:

  • "$(...)" - это подстановка команды , которая подставит результаты команды в качестве значения - в этом случаерезультат присваивается target.
  • echo "$source"|sed 's#[^a-z0-9]\+#.#' просто передает результат вывода echo (например, то, что в source) в sed для простой замены каждый символ нестрочная буква или цифра, за которой следует + с периодом 1 .Примечание: кавычки ".." вокруг $source являются правильными в подстановке команд.
  • Не существует внутренней причины, по которой присвоение -n переменной приведет к любым неприятностям.То, что вы делаете с переменной, это другой вопрос, но достаточно сказать, что трудно увидеть какие-либо проблемы.
  • "POSIX-оболочка там не реализует printf" - А?Любая оболочка, не реализующая printf, будет скорее исключением, чем правилом.См. printf - Открытая библиотека групп , которая является POSIX.

Если вы пытаетесь printf вывод, который начинается с '-', просто предшествуйте выводу с "--" дляукажите End-of-Options перед строкой, которую вы хотите напечатать, и все будет хорошо.В вашем примере "-n", printf - это единственный способ, которым вы будете выводить переменную, начинающуюся с одиночного '-', например:

$ t="-n"

$ printf -- "%s\n" "$t"
-n

( note: вам не нужно включать "--" в printf "%s\n" "$var", единственное время, когда вы должны включить его, - printf -- "-foo\n", иначе вы получите "invalid option error".

For echo Вы можете включить интерпретацию обратной косой черты с помощью -e и включить backspace , например,

$ echo -e " \b$t"
-n

Я думаю, что это охватило все проблемы. Если нет, дайте мне знать., если у вас есть какие-либо дополнительные вопросы, оставьте комментарий ниже или отредактируйте и добавьте к своему вопросу.

сноски:

  1. примечание: + isn 'Это часть базовых регулярных выражений , и ее не нужно экранировать, но если есть какие-либо вопросы, безопаснее включить в собственный класс символов , например, [^a-z0-9][+].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...