Bir satırda işlevi ~ / .bashrc yazınız.


40

Neden .bashrcdosyaya sadece bir satırda bir fonksiyon yazmaya çalıştığımda ,

list(){ ls -a }

Hata mı alıyorum?

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

ama çok satırda yazdığımda sorun değil mi?

list(){
    ls -a
}

Yığın Taşması ile ilgili daha sonra eşdeğer bir soru var .
sampablokuper

Yanıtlar:


33

İşlevler bashesas olarak bileşik komutlar (veya kod blokları) olarak adlandırılır. Kimden 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.

Sebep yok, sadece sözdizimi var.

Tek hat işlevi verilen liste bir satır ya da ile sona olmadığından ;, bashşikayet etmektedir.


42

;Fonksiyonun sonunda bir ihtiyaç vardır :

list(){ ls -a ; }

çalışmalı.

Bash için bir işlev tanımının sözdizimi

name () { list ; }

Bunun bir ;parçası olmadığına dikkat edin list.

Bu ;yerde gerekli olan bir çeşit sözdizimi anomalisidir. bashSpesifik değil , bunun için de aynı ksh, ancak bunun için ;gerekli değil zsh.


18

Tek bir komutun (";") sonu newline ile belirtilir. Oneline sürümde }sonlandırılmamış ls -akomutun argümanı olarak ayrıştırılır . Bunu yaparsanız görebileceğiniz:

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

İşlev bildirimi içindeki komutun sondaki kaşlı ayracı nasıl yuttuğunu görün?


2
Harika bir açıklama! Yani bu kadar değil anomalisi sadece sözdizimi; Aslında bunun için bir mantık var.
Don Hatch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.