Ksh

1-liner 程序替換 ksh

  • June 17, 2020

我有這個命令,它適用於bash

sh <(curl -sSl https://appi.sh/launch)(啟動此互動式腳本

我也想讓這個 1-liner 工作ksh。目前,它錯誤:

syntax error: `(' unexpected`

ksh從as執行腳本sh launch.sh可以正常工作,所以我希望有一種方法可以讓一個單一的 1-liner 可以在 bash/ksh 中工作,而不會成倍地增加命令的長度。

程序替換功能來自 ksh,最初來自 ksh86,但最初,它僅在支持/dev/fd/n特殊文件的系統上可用。

這只在 2012 年發布的 ksh93u+ 中發生了變化,與後來添加了對程序替換的支持的許多其他 shell 一樣,ksh 在/dev/fd不可用時可以求助於命名管道。ksh93通常被認為是實驗性的,並且它不完全向後兼容 ksh88,所以你會發現有幾個系統一直堅持使用 ksh88,據我所知,它們從未使用過命名管道。

程序替換從未添加到 ksh (pdksh) 的公共域複製或其任何後代(如 mksh 或 OpenBSD 的 sh)中,儘管在這種情況下它們會給出不同措辭的錯誤消息。

所以看起來你有一個舊版本的 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(請參閱非 POSIXgrep -Rsed -i使用舊版本的 AT&T ksh。

引用自:https://unix.stackexchange.com/questions/593506