web-dev-qa-db-ja.com

bash関数定義の予期しないトークン付近の構文エラー

私を許して;私はbashファイルなどはかなり新しいです。これが私の.bashrcのコピーです。

alias k='kate 2>/dev/null 1>&2 & disown'

function kk {kate 2>/dev/null 1>&2 & disown}

1行目のエイリアスは正常に機能しますが、2行目は次のようにスローします。

bash: /home/mozershmozer/.bashrc: line 3: syntax error near unexpected token `{kate'
bash: /home/mozershmozer/.bashrc: line 3: `function kk {kate 2>/dev/null >1>&2 & disown}'

Linux Mint 17.3を実行していますが、.bashrcファイルに含まれているのは2行だけです。私のマシンの他のほとんどすべてがデフォルトのバニラです。最終的には、この関数をいじって特定のことを実行したいのですが、すぐに構文の壁にぶつかります。ここに挙げた正確な関数は、構文をより明確に理解できるようにするための一種の実験的なダミーです。

3
MozerShmozer

bashおよびその他のPOSIXシェルでは、{および}は、このコンテキストでは特別なwordsであるほど、特別なsymbolsではありません。関数定義のように複合コマンドを作成する場合、それらがwordsのまま、つまり空白で囲まれていることが重要です。

このような単一行関数定義の最後のコマンドは、セミコロンで終了する必要があります。それ以外の場合、右中括弧}はコマンドの引数として扱われます。


余談ですが、if関数を他のPOSIXシェルに移植できるようにするには、別の関数構文を使用することをお勧めします。

kk () { kate 2>/dev/null 1>&2 & disown; }

functionの使用はbashに固有ですが、ここで指定する形式はbashだけでなく、sh、Korn、Almquistシェルなどでも機能します。

disownもbash固有です。

7
Fox

複数行に配置することで、余分な;を配置する必要がなくなり、多くのコマンドが含まれている場合でも、関数を作成する1つの方法が提供されます。

function kk {
    kate 2>/dev/null 1>&2 & disown
}
0
ctrl-alt-delor