fisk (Unix-skal)

Fisk
Originalförfattare Axel Liljencrantz
Utvecklare Fiskskalsutvecklare
Initial release 13 februari 2005 ; för 18 år sedan ( 2005-02-13 )
Stabil frisättning
Edit this on Wikidata 3.6.0 / 7 januari 2023 ; 45 dagar sedan ( 7 januari 2023 )
Förvar
Skrivet i C++ , rost
Operativ system Unix-liknande
Typ Unix-skal
Licens Endast GPL-2.0
Hemsida fishshell .com

fish är ett Unix-skal med fokus på interaktivitet och användbarhet. Fish är designad för att ge användaren funktioner som standard snarare än genom konfiguration. Fisk betraktas som ett exotiskt skal eftersom det inte strikt följer POSIX- skalstandarderna, enligt underhållarnas gottfinnande.

Höjdpunkter

Fish har " sök medan du skriver " automatiska förslag baserat på historik och aktuell katalog. Detta är i grunden som Bashs Ctrl + R -historiksökning, men eftersom det alltid är på istället för att vara ett separat läge, får användaren kontinuerlig feedback medan han skriver kommandoraden, och kan välja förslag med piltangenterna, eller som i Bash, tryck på Tab ↹ för en flikkomplettering istället. Tab-komplettering är funktionsrik, expanderande filsökvägar (med jokertecken och parentesexpansion ), variabler och många kommandospecifika kompletteringar. Kommandospecifika kompletteringar, inklusive alternativ med beskrivningar, kan till viss del genereras från kommandonas man-sidor .

Fish föredrar funktioner som kommandon snarare än syntax. Detta gör funktioner upptäckbara när det gäller kommandon med alternativ och hjälptexter. Funktioner kan också ha en läsbar beskrivning. Ett speciellt hjälpkommando ger tillgång till all fiskdokumentation i användarens webbläsare .

Syntax

Syntaxen liknar ett POSIX- kompatibelt skal (som Bash), men avviker på viktiga sätt där skaparna anser att POSIX-skalet var dåligt utformat.







   




 
  
  
    
 
  


  
 
 
  
 
  



   






   
       
   
   # Variabeltilldelning  #  # Ställ in variabeln 'foo' till värdet 'bar'.  # Fish använder inte operatorn =, som i sig är känslig för blanksteg.  # Kommandot 'set' sträcker sig till att arbeta med arrayer, scoping, etc.  >  set  foo bar  >  echo  $foo  bar  # Kommandosubstitution  #  # Tilldela utdata från kommandot 'pwd' till variabeln 'wd'.  # Fish använder inte backticks (``), som inte kan kapslas och kan förväxlas med enstaka citattecken (' ').  >  set  wd  (  pwd  )  >  set  wd  $(  pwd  )  # sedan version 3.4  >  echo  $wd  ~  # Arrayvariabler. 'A' blir en array med 5 värden:   >  set  A  3  5  7  9  12  # Array slicing. 'B' blir de två första elementen i 'A':   >  set  B  $A  [  1  2  ]  >  echo  $B  3  5  # Du kan indexera med andra arrayer och till och med beordra  # substitution output:  >  echo  $A  [(  seq 3  )]  3  5  7  # Radera det tredje och femte elementet i 'A'  >  ställ in  --radera A  [  $B  ]  >  echo  $A  3  5  9  # for-loop, konvertera jpegs till pngs  >  för  i  in  *.jpg convert  $i  (  basnamn  $i  .jpg  )  .png  end  # fish stöder flerradshistorik och redigering.  # Semikolon fungerar som nyrader:  >  för  i  i  *.jpg  ;  konvertera  $i  (  basnamn  $i  .jpg  )  .png  ;  avsluta  # while-loop, läs raderna /etc/passwd och mata ut det femte  # kolonavgränsade fältet från filen. Detta ska vara   # användarbeskrivningen.  >  while  read  line  set  arr  (  echo  $line  |  tr :  \n  )  echo  $arr  [  5  ]  end  <  /etc/passwd  # String replacement (ersättning av alla i med I)  >  string replace -a  "i"  "I"  " Wikipedia"  WikIpedia 

Inget implicit underskal

Vissa språkkonstruktioner, som pipelines , funktioner och loopar , har implementerats med hjälp av så kallade subshells i andra skalspråk . Subshells är underordnade program som kör några kommandon för skalet och sedan avslutar. Denna implementeringsdetalj har vanligtvis bieffekten att eventuella tillståndsändringar som görs i underskalet, såsom variabeltilldelningar, inte sprider sig till huvudskalet. Fisk gafflar aldrig av så kallade subshells; alla inbyggda funktioner är alltid fullt fungerande.






  # Detta kommer inte att fungera i många andra skal, eftersom "läs" inbyggda  # kommer att köras i sitt eget underskal. I Bash kan den högra sidan av röret   # inte ha några biverkningar. I ksh fungerar kommandot nedan, men   # vänster sida kan inte ha några biverkningar. I fisk och zsh   kan båda # sidor ha biverkningar.  >  katt *.txt  |  läs  rad 

Exempel på rörligt uppdrag

Det här Bash-exemplet gör inte som det verkar: eftersom loopkroppen är ett underskal är uppdateringen till $found inte beständig.

   
       
    
  
 hittade  =  ''  cat /etc/fstab  |  medan  du läser  dev mnt vila  ;  gör  om  testa  "  $mnt  "  =  "/"  ;  sedan  hittade  =  "  $dev  "  fi  klar 

Jobba runt:


  
       
    
  
 hittade  =  ''  under  läsning av  dev mnt rest  ;  gör  om  testa  "  $mnt  "  =  "/"  ;  sedan  hittade  =  "  $dev  "  fi  klar  < /etc/fstab 

Fisk behöver ingen lösning:

      
    
  
 set  hittades  ''  cat /etc/fstab  |  medan  läs  dev mnt vila  om  test  "  $mnt  "  =  "/"  set  hittade  $dev  end  end 

Universella variabler

Fisk har en funktion som kallas universella variabler, som gör att en användare permanent kan tilldela ett värde till en variabel över alla användarens fiskskal. Variabelvärdet kommer ihåg över utloggningar och omstarter, och uppdateringar sprids omedelbart till alla körande skal.



 

  # Detta kommer att göra emacs till standardtextredigerare. '--universal' (eller '-U') säger åt fisken att   # göra detta till en universell variabel.  >  set  --universal EDITOR emacs  # Det här kommandot gör att den aktuella arbetskatalogdelen av fish  #-prompten blir blå på alla fisk-instanser som körs.  >  set  --universal fish_color_cwd blå 

Andra funktioner

Översättningstabell för bash/fisk

Funktion Bash syntax fisk syntax Kommentar

variabel expansion: med orddelning och globtolkning
$var

eller

${var[@]}

eller

${var[*]}
medvetet utelämnat Identifierad som en primär orsak till buggar i posix-kompatibla skalspråk

variabel expansion: skalär
"$var"
medvetet utelämnat Varje variabel är en array

variabel expansion: array
"${var[@]}"
$var
Citerar inte nödvändigt för att undertrycka orddelning och globtolkning. Istället betyder citat serialisering.

variabel expansion: som en mellanslagsseparerad sträng
"${var[*]}"
"$var"
redigera rad i textredigeraren Ctrl + X , Ctrl + E Alt + E Vid anrop flyttas radinmatning till en textredigerare
utvärdera linjeinmatning Ctrl + Alt + E Utvärderar uttryck på plats i linjeredigeraren
historia färdigställande Ctrl + R implicit
historiesubstitution !! medvetet utelämnat Ej upptäckbar
explicit underskal
(uttryck)
fisk -c uttryck
kommandosubstitution
"$(uttryck)"

"$(uttryck)" eller (uttryck | strängsamling)

processsubstitution
<(uttryck)
(uttryck | psub)
Kommando, inte syntax
logiska operatorer
   !cmd  &&  echo  FAIL  ||  eko  OK 
 
   inte  kommando  och  eko  FAIL  eller  eko  OK 
variabelt uppdrag
var=värde
 ställ in  var-värde 

strängbearbetning: ersätt
"${HOME/alice/bob}"
sträng ersätt alice bob $HOME

strängbearbetning: ta bort prefix- eller suffixmönster, icke-girigt eller girigt
  
 
  
  var  =  abc  "  ${  var  #*.  }  "  #bc  "  ${  var  ##*.  }  "  #c  "  ${  var  %.*  }  "  #ab  "  ${  var  %%.*  }  "  #a 
     string replace --regex  '.*?\.(.*)'  '$1'  abc  #bc  string replace --regex  '.*\.(.*)'  '$1'  abc  #c  string replace --regex  '( .*)\..*'  '$1'  abc  #ab  string replace --regex  '(.*?)\..*'  '$1'  abc  #a 
exportvariabel
export var
set --export var
Alternativ som kan upptäckas via flikkomplettering
funktion-lokal variabel
lokal var
som standard
scope-lokal variabel ingen motsvarighet
set --local var
ta bort variabel
unset var
set --erase var
kontrollera om det finns en variabel
test -v var
set --query var
arrayinitiering
var=( abc )
 set  var abc 
Varje variabel är en array
array-iteration
  
   
 för  i  i  "  ${  var  [@]  }  "  ;  gör  echo  "  $i  "  gjort 
 
   
 för  i  i  $var  echo  $i  slut 

argumentvektor: alla argument
"$@"
$argv

argumentvektor: indexering
"$1"
$argv[1]

argumentvektor: längd
$#
(räkna $argv)

argumentvektor: shift
flytta
 set  --radera argv  [  1  ] 
arrayrepresentation i miljövariabler
 PATH  =  "  $PATH  :  $HOME  /.local/bin" 
  ställ in  PATH  $PATH  $HOME  /.local/bin 
fisk antar kolon som arrayavgränsare för att översätta variabler till och från miljön. Detta är i linje med många array-liknande miljövariabler, som $PATH och $LS_COLORS.
exportera och köra
LANG=C.UTF-8 python3
 env  LANG  =  C.UTF-8 python3 
env LANG = C.UTF-8 python3 fungerar i vilket skal som helst, eftersom env är ett fristående program.
aritmetisk
$((10/3))
matematik "10/3"
expr 10 / 3 fungerar i alla skal, eftersom expr är ett fristående program.
flyktsekvens
$'\e'
\e
printf '\e' fungerar i båda skalen; deras printf är båda kompatibla med GNU printf fristående program.

enkel citerad sträng: flyktsekvenser
 'mom'  \'  's sista snedstreck: \' 
 'mammas  sista  snedstreck:  \\  ' 
Bash kräver bara att det enstaka citatet ersätts i enstaka citerade strängar, men ersättningen är 4 tecken lång. Samma ersättning fungerar i fisk, men fisk stöder en regelbunden flyktsekvens för detta, och kräver därför flyktande snedstreck också (förutom tillåter enstaka omvänt snedstreck som inte föregår ett annat omvänt snedstreck eller enstaka citattecken).

Se även

externa länkar