У меня есть эта команда, которая отлично работает для bash
:
sh <(curl -sSl https://appi.sh/launch)
( запускает этот интерактивный скрипт)
Я бы хотел, чтобы этот однострочный код работал и для ksh
. В настоящее время возникают ошибки:
syntax error: `(' unexpected`
Запуск скрипта из ksh
, поскольку sh launch.sh
работает нормально, поэтому я надеюсь, что есть способ иметь единственный 1-строчный, который будет работать как в bash, так и в ksh без экспоненциального увеличения длины команды.
Функция подстановки процессов исходит от ksh, первоначально от ksh86, но изначально она была доступна только в системах, поддерживающих /dev/fd/n
специальные файлы..
Это изменилось только в ksh93u+, выпущенном в 2012 году, где, как и во многих других оболочках, которые позже добавили поддержку замены процессов, ksh мог использовать именованный канал, когда /dev/fd
был недоступен. ksh93
часто считают экспериментальным и он не полностью обратно совместим с ksh88, поэтому вы обнаружите, что несколько систем так или иначе придерживались ksh88, которые, насколько мне известно, никогда не использовали именованный канал.
Подстановка процессов никогда не добавлялась ни к общедоступному клону ksh (, ни к pdksh ), ни к каким-либо из его потомков (, таких как mksh или sh из OpenBSD ), хотя они выдают сообщение об ошибке с другой формулировкой в тот случай.
Похоже, у вас более старая версия AT&T ksh и вы работаете в системе, в которой /dev/fd
недоступен или был недоступен при сборке ksh.
В любом случае подстановка процессов не является функцией POSIX. Он доступен только в AT&T ksh (с 1986 ), zsh (с 1990 )и bash (с 1993 ), а yash использует <(cmd)
и >(cmd)
для чего-то другого (. ] перенаправление процесса). rc
и потомки (и в некоторой степениfish
)также имеют эту функцию, но с другим синтаксисом.
Здесь можно просто сделать:
# without arguments for the script:
curl -sSl https://appi.sh/launch | sh
# with arguments
curl -sSl https://appi.sh/launch | sh -s arg1 arg2
Хотя для этого самого скрипта launch
это было бы неуместно, так как он читает со своего стандартного ввода. Или:
# without arguments for the script:
sh -c "$(curl -sSl https://appi.sh/launch)"
# with arguments:
sh -c "$(curl -sSl https://appi.sh/launch)" sh arg1 arg2
Чтобы все содержимое скрипта передавалось в строку. Это будет работать до тех пор, пока скрипт не слишком большой (, укладывается в ограничение размера аргументов+окружения или ограничение размера одного аргумента для тех систем, в которых он есть, например Linux ).
В любом случае, несмотря на то, что этот скрипт выглядит так, как будто он сам написан с допустимым синтаксисом POSIX sh
,предполагается, что системные утилиты GNU -, такие как (, см. не -POSIX grep -R
или sed -i
), поэтому я бы сказал, что это, вероятно, не будет работать в системе, которая поставляется со старой версией AT&T. кш.