Когда я использую код ниже в терминале SSH для CentOS, он работает нормально:
paste <(printf "%s\n" "TOP")
Но если я помещаю тот же строчный код в сценарий оболочки (test.sh) и запускаю сценарий оболочки из терминала, он выдаст ошибку, как это
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
Как я могу решить эту проблему?
dash
вместоbash
).#!/bin/sh
наверху. Я выполнил как,bash test.sh
но это тоже не сработало.bash
в режиме POSIX этот синтаксис также не поддерживается (при вызове с--posix
или как/bin/sh
). Использование#!/bin/bash
.POSIXLY_CORRECT
переменная, установленная при запускеbash
?#!/bin/bash
проблему.Ответы:
Подстановка процессов не определен POSIX, поэтому не поддерживает все POSIX оболочки, только некоторые оболочки , как
bash
,zsh
,ksh88
,ksh93
поддержка.В
Centos
системе/bin/sh
есть символическая ссылка на/bin/bash
. Когдаbash
вызывается с именемsh
,bash
переходит в режим posix ( Bash Startup Files - вызывается с именем sh ). В режиме posix,process substitution
не поддерживается, вызывает синтаксическую ошибку.Скрипт должен работать, если вы звоните
bash
напрямуюbash test.sh
. Если нет, возможноbash
, перешел в режим posix. Это может произойти, если вы начинаетеbash
с--posix
аргумента или переменнаяPOSIXLY_CORRECT
установлена приbash
запуске:Или
bash
построен с--enable-strict-posix-default
опцией.Здесь вам не нужно подменять процессы, вы можете использовать стандартные каналы оболочки:
-
это стандартный способ сказать,paste
чтобы прочитать данные из стандартного ввода. В некоторыхpaste
реализациях вы можете опустить его, хотя это не стандартно.Это было бы полезно при вставке вывода более чем одной команды, например:
На системах, которые поддерживают
/dev/fd/n
, это можно сделатьsh
с помощью:(это то, что
<(...)
делает внутренне).источник
Вот еще один обходной путь. Вместо запуска команды запустите bash и передайте команду bash, используя -c:
источник