1-liner 程序替換 ksh
我有這個命令,它適用於
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 -R
或sed -i
使用舊版本的 AT&T ksh。