kshの1ラインプロセスの交換

kshの1ラインプロセスの交換

このコマンドがあり、以下で動作しますbash

sh <(curl -sSl https://appi.sh/launch)(発表この対話型スクリプト)

私はまた、この1線形が動作したいと思いますksh。現在のエラーは次のとおりです。

syntax error: `(' unexpected`

kshASでスクリプトを実行するとうまくsh launch.sh機能するので、コマンドの長さを指数関数的に増やすことなくbash / kshで単一の1行操作を実行する方法があることを望みました。

ベストアンサー1

/dev/fd/nプロセス交換機能はもともとksh86のkshから来ましたが、最初は特別なファイルをサポートするシステムでのみ利用可能でした。

この状況は、2012年にksh93u +がリリースされるまで変わらず、後でプロセス置換のサポートを追加した他の多くのシェルと同様に、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)とyashは>(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などのシステムでは単一パラメータのサイズ制限内に収まる)機能します。

とにかく同時にそのスクリプトshそれ自体は、システムのユーティリティがGNUに似ていると仮定する有効なPOSIX構文で書かれているようです(非POSIXgrep -Rまたは参照sed -i)。したがって、以前のバージョンのAT&T kshがインストールされているシステムでは機能しない可能性があります。

おすすめ記事