構文エラー:ファイル記述子≥10のioリダイレクトに予期しない単語が含まれています。

構文エラー:ファイル記述子≥10のioリダイレクトに予期しない単語が含まれています。

Debian 7 には次のシェルスクリプトがあります。

#!/bin/sh


case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when some other interface comes up
        exit 0
        ;;
    *)
        ;;
esac

(
flock -e 200

FLAGFILE=/var/run/cyvo-auto-started

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

# Launch CyVo without the lock and as cyvo user
flock -u 200
sudo -u cyvo /usr/local/bin/cyvo-launch.sh

) 200>/var/lock/cyvo-autostart-lock # word unexpected here? (line 29)

それが私に与えるエラーは次のとおりです。

./cyvo: 29: ./cyvo: Syntax error: word unexpected

これは提案された構文なので本当に混乱しています。グループ注文する。/var/lock/cyvo-autostart-lockを指すファイル記述子200を渡します()

私は何が間違っていましたか?

ベストアンサー1

シェルスクリプトで移植可能に使用できる唯一のファイル記述子番号は、0から9まで(つまり、単一の数値)です。引用するPOSIX:

開いたファイルは、0 から始まる 10 進数で表されます。可能な最大値は実装によって定義されます。ただし、すべての実装はアプリケーションを使用するために少なくとも0〜9(含む)をサポートする必要があります。この数字を「ファイル記述子」と呼びます。 (…)ファイル記述子番号を指定するために、リダイレクト演算子の前に1つ以上の数字(<スペース>文字は許可されていません)が続くことがあります。

これ文法明らかに、リダイレクト演算子の前に複数の数字がある可能性があります。ただし、ほとんどのシェルは、演算子の前の数字が単一の数字で構成されている場合、ファイル記述子としてのみ解析します。たとえば、POSIX仕様によれば、ファイルecho 10>aディスクリプタ10をリダイレクトして空のaファイルを作成する必要があります。そうしないと、シェルがファイルディスクリプタ番号として10をサポートしていないため、エラーが発生します。このエラーは、プロセスで開かれたファイル数の制限を超えるファイル記述子の数によっても発生する可能性があります。

しかし、実際にはほとんどのシェルはそれをecho 10 >awrite 10inに解析しますa。 ATT ksh93 および posh も dash、mksh、zsh と同様に仕様に準拠していません。

$ ksh -c 'echo 10>a; wc -c a'
3 a
$ posh -c 'echo 10>a; wc -c a'
3 a

Linuxでは、POSIX準拠のbash、yash、およびBusyBoxのashのみが見つかりました。

$ bash -c 'echo 10>a; wc -c a' 

0 a

同様に(…) 200>somefile、リダイレクトに解析する必要があり、シェルがこれらの高いファイル記述子をサポートしているかどうかに応じて動作する場合と動作しない場合があります。ただし、ほとんどのシェルは200この部分をファイル記述子番号ではなく通常のトークンに解析するため、構文エラーを報告します。

関連する注意では、空白行はecho 01>&1ファイル01記述子番号で解析する必要があるため、印刷する必要がありますが、再度 bash と BusyBox ash のみを実行できます。

したがって、実際には1桁の数字のファイル記述子のみを使用できます。シェルスクリプトから。記述子0、1、2は標準的な意味を有し、記述子3~9は自由に使用できる。シェルは内部目的のためにfd 3–9を使用しません。どのファイルディスクリプタを選択しても、シェルの起動時にファイルディスクリプタがすでに開いている可能性がありますが、これは問題ではありません。スクリプト内のすべてのファイル記述子の再割り当てはスクリプト内に保持され、スクリプトの親プロセスには影響しません。

おすすめ記事