Странная разница в требовании экранирования cmd / bash / awk - PullRequest
1 голос
/ 29 апреля 2020

Мне нужно запустить довольно странно выглядящую командную строку на нескольких Windows системах, и я ожидаю, что смогу использовать ту же самую на Windows 7 с Git для Windows (GfW) или Windows 10 с Ubuntu 18.04, работающим в Windows Подсистема для Linux (WSL).

Командная строка , естественно, не , показанная здесь, но принцип заключается в одни и те же. Мне нужно использовать awk из командной строки Windows, мне нужно вызвать awk из bash, чтобы иметь возможность повторно использовать одну и ту же командную строку как в WSL, так и в GfW, и мне нужно сделать весь вызов из одного и тот же сеанс командной строки.

Вкл. Windows 10 с Ubuntu 18.04, работающим в подсистеме Windows для Linux:

cmd /c "echo Something strange is going on |bash -c "awk '{ print $1 }'""
Something strange is going on

Теперь что-то заставило awk упустить $ 1 переменная. Мне нужно экранировать знак доллара:

>cmd /c "echo Something strange is going on |bash -c "awk '{ print \$1 }'""
Something

Это выглядит лучше, было выведено только первое слово!

Теперь то же самое на Windows 7 с Git для Windows:

>cmd /c "echo Something strange is going on |bash -c "awk '{ print \$1 }'""
awk: cmd. line:1: { print \$1 }
awk: cmd. line:1:         ^ backslash not last character on line
awk: cmd. line:1: { print \$1 }
awk: cmd. line:1:         ^ syntax error

Подождите, что ?! Я не могу использовать backsla sh, чтобы избежать знака доллара! Что с этим? Мне нужно удалить его:

>cmd /c "echo Something strange is going on |bash -c "awk '{ print $1 }'""
Something

Что я здесь не так делаю? Почему мне нужно по-разному экранировать одну и ту же командную строку в зависимости от того, выполняется ли она на Win7 / GfW или Win10 / WSL? Я также пытался экранировать командную строку с помощью ^, но, насколько я могу судить, знак доллара не должен требовать такого особого внимания для использования с cmd.exe?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Я действительно не нашел правильного объяснения того, что происходит, но простой обходной путь - вызвать Awk с файлом сценария вместо использования командной строки, например так:

cmd /c "echo Something strange is going on |bash -c "awk -f script.awk""

где файл сценария просто содержит предыдущий сценарий (в действительности более продвинутый):

{ print $1 }

По крайней мере, эта командная строка работает без помех, как на Windows 7, так и на Git для Windows и Windows 10 с Ubuntu 18.04, работающим на подсистеме Windows для Linux, и мне не нужно особо беспокоиться о побеге ...

0 голосов
/ 01 мая 2020

Я думаю, что особое внимание следует go к символу трубы перед bash. Попробуйте экранировать его с помощью каретки ^|.

Также может быть проблема с вложенными двойными и одинарными кавычками. Я не знаю, мешают ли они при разборе. Может быть, попробуйте заменить внешний с обратными чертами.

...