Это ошибочная версия
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