fisk (Unix-skal)
Originalförfattare | Axel Liljencrantz |
---|---|
Utvecklare | Fiskskalsutvecklare |
Initial release | 13 februari 2005 |
Stabil frisättning | |
Förvar | |
Skrivet i | C++ , rost |
Operativ system | Unix-liknande |
Typ | Unix-skal |
Licens | Endast GPL-2.0 |
Hemsida |
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
- Avancerat slutförande av flikar.
- Syntaxmarkering med omfattande felkontroll.
- Stöd för X urklipp .
- Smart terminalhantering baserad på terminfo .
- Sökbar kommandohistorik .
- Webbaserad konfiguration.
Ö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)" |
|
|
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
- Officiell webbplats – innehåller dokumentation och nedladdningar
- fiska på GitHub (aktiv)
- fisk på Gitorious (föråldrad)
- fisk på SourceForge (föråldrad)
- Fiskanvändare – allmän diskussionslista för fiskanvändare
- Shell Translation Dictionary - en annan översättningstabell för Bash/Fish