Что означает perl -pe "s | $ PASSWORD | <PASSWORD>| g"? - PullRequest
1 голос
/ 09 мая 2019

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

perl -pe "s|$PASSWORD|<PASSWORD>|g"

Ответы [ 3 ]

9 голосов
/ 09 мая 2019

Это ошибочная версия

PASSWORD="$PASSWORD" perl -pe's/\Q$ENV{PASSWORD}/<PASSWORD>/g'

В этой исправленной версии оболочка запускает perl, передавая переменную оболочки $PASSWORD в perl в качестве переменной среды PASSWORD.

perl будет перебирать каждую строку указанного файла (ов) (или STDIN, если в качестве аргументов не указаны пути). В каждом он заменит каждый экземпляр значения переменной среды PASSWORD на <PASSWORD>. Эти возможно измененные строки выводятся в STDOUT.

$ PASSWORD=bar

$ cat file
foo
bar
foobarfoobarfoo
foo

$ PASSWORD="$PASSWORD" perl -pe's|\Q$ENV{PASSWORD}|<PASSWORD>|g' file
foo
<PASSWORD>
foo<PASSWORD>foo<PASSWORD>foo
foo

Версия, которую вы представили, похожа.

$ PASSWORD='foobar'

$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
fobar <PASSWORD>

Однако ошибки в коде в представленной вами версии приводят к его различным ошибкам, если исходный пароль содержит |, \, $, @, +, *, ?, ^, (, ), [, ], {, } и, возможно, другие символы.

$ PASSWORD='foo|bar'

$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
syntax error at -e line 1, near "PASSWORD>"
Execution of -e aborted due to compilation errors.


$ PASSWORD='foo*bar'

$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
<PASSWORD> foo*bar


$ PASSWORD='$x[exec("echo hacked")]'

$ printf "fobar %s\n" "$PASSWORD" | perl -pe "s|$PASSWORD|<PASSWORD>|g"
hacked
3 голосов
/ 10 мая 2019

Опция -p создает цикл while, который охватывает содержимое -e. Для этого конкретного вопроса, предполагая PASSWORD=xxx, вот сгенерированный код:

LINE:
  while (<>) {
      s|xxx|<PASSWORD>|g
  } continue {
      print or die "-p destination: $!\n";
  }

Как уже отмечали другие люди, $PASSWORD возможно заменяется на shell значением env var "PASSWORD", а не переменной в коде perl. Я поставил «ххх», чтобы продемонстрировать это.

Подробнее об этом можно узнать по адресу: https://perldoc.pl/perlrun#-p (или man perlrun)

Документация "perlrun" также объясняет каждый отдельный параметр команды "perl".

1 голос
/ 09 мая 2019

Обрабатывает все строки в STDIN и заменяет значение переменной среды PASSWORD на заполнитель <PASSWORD>.

Вы можете попробовать это на этом минимальном примере:

export PASSWORD=secret_password
echo "My password is: secret_password" | perl -pe "s|$PASSWORD|<PASSWORD>|g"

Вывод:

My password is: <PASSWORD>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...