Однострочная замена процесса для ksh

У меня есть эта команда, которая отлично работает для bash:

sh <(curl -sSl https://appi.sh/launch)( запускает этот интерактивный скрипт)

Я бы хотел, чтобы этот однострочный код работал и для ksh. В настоящее время возникают ошибки:

syntax error: `(' unexpected`

Запуск скрипта из ksh, поскольку sh launch.shработает нормально, поэтому я надеюсь, что есть способ иметь единственный 1-строчный, который будет работать как в bash, так и в ksh без экспоненциального увеличения длины команды.

2
17.06.2020, 20:58
1 ответ

Функция подстановки процессов исходит от 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. кш.

4
18.03.2021, 23:26

Теги

Похожие вопросы