関数を1行で〜/ .bashrcに書き込みます


40

関数を1行だけで.bashrcファイルに書き込もうとすると、

list(){ ls -a }

エラーが発生しますか?

bash: /home/kasiya/.bashrc: line num: syntax error: unexpected end of file

しかし、複数行で書くときは大丈夫ですか?

list(){
    ls -a
}

Stack Overflowについては、後で同等の質問があります。
サンパブロクパー

回答:


33

の関数はbash、本質的に複合コマンド(またはコードブロック)という名前です。からman bash

Compound Commands
   A compound command is one of the following:
   ...
   { list; }
          list  is simply executed in the current shell environment.  list
          must be terminated with a newline or semicolon.  This  is  known
          as  a  group  command. 

...
Shell Function Definitions
   A shell function is an object that is called like a simple command  and
   executes  a  compound  command with a new set of positional parameters.
   ... [C]ommand is usually a list of commands between { and },  but
   may  be  any command listed under Compound Commands above.

理由はありません。それは単なる構文です。

指定された1行関数のリストは改行やa ;で終了していないため、bash文句を言います。


42

;関数の最後に必要なものがあります:

list(){ ls -a ; }

動作するはずです。

bashの関数定義の構文は次のように指定されます

name () { list ; }

;一部ではないが含まれていることに注意してくださいlist

ことを;この場所で必要とされる異常な構文の一種です。これはbash特定のものではなく、と同じですがksh;では必須ではありませんzsh


18

単一のコマンドの終わり( ";")は、改行によって暗示されます。onelineバージョンで}は、終了していないls -aコマンドの引数として解析されます。あなたがそうすれば見ることができます:

$ foo(){ echo "a" }
}
$ foo
a }

関数宣言内のコマンドが末尾の中括弧をどのように飲み込むかを見てください。


2
素晴らしい説明!したがって、単なる構文の異常ではありません。実際にはいくつかのロジックがあります。
ドンハッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.