2015-09-09 2 views
1

У меня есть этот скрипт (просто скопировать и вставить его в оболочку)оболочки с «-bash: плохая замена: без закрывающей`) '»

perl -c <(cat <<'EOF' 
#!/usr/bin/perl 
while(@mylist>1){ 
if($i > $initnum) {$i--;} 
    {splice(@mylist,1);} 
} 
EOF 
) 

На одной машине Linux, я получил /dev/fd/63 syntax OK вывод, который это нормально. Но на терминале macbook я видел это

$ perl -c <(cat <<'EOF' 
> #!/usr/bin/perl 
> while(@mylist>1){ 
> if($i > $initnum) {$i--;} 
> {splice(@mylist,1);} 
> } 
> EOF 
>) 
-bash: bad substitution: no closing `)' in <(cat <<'EOF' 
#!/usr/bin/perl 
while(@mylist>1){ 
if($i > $initnum) {$i--;} 
    splice(@mylist 
} 
EOF 
) 

Мой вопрос, почему такая ошибка. И в идеале, как исправить это на mac.

+0

'bash --version' на каждой машине, пожалуйста. – bishop

+0

Появляется ошибка парсера; ошибка возникает в версии 3.2, но не в 4.3. – chepner

+0

В mac-версии есть 'GNU bash, версия 3.2.51 (1) -release (x86_64-apple-darwin13)', на linux есть 'GNU bash, версия 4.2.25 (1) -release (x86_64-pc-linux- gnu) ' –

ответ

2

Вероятно несовместимая версия (или сломана версия, как @chepner прокомментировал) Баш на вашем MacOS, так что вы можете наивно переписать его с echo:

echo '#!/usr/bin/perl 
while(@mylist>1){ 
if($i > $initnum) {$i--;} 
    {splice(@mylist,1);} 
} 
' | perl -c 

Или, если вам нужно держать cat бизнес, вы может разорить его в pipeline:

cat <<'EOF' | perl -c 
#!/usr/bin/perl 
while(@mylist>1){ 
if($i > $initnum) {$i--;} 
    {splice(@mylist,1);} 
} 
EOF 
3

это парсер ошибка в bash 3.2, но ваш пример является весьма мучительным для замены простого здесь документа:

perl -c <<'EOF' 
#!/usr/bin/perl 
while(@mylist>1){ 
if($i > $initnum) {$i--;} 
    {splice(@mylist,1);} 
} 
EOF 

Это не кажется вероятным, что компания Apple никогда не грузит новую версию bash по умолчанию, так что вам лучше всего установить его самостоятельно (с помощью Homebrew, например).

+0

Я знаю. У меня было другое использование для этого конкретного формата. :) –

Смежные вопросы