
Hjälp med Bash
SV: Hjälp med Bash
Inte riktigt det jag tänkte på, men det hjälpte mig med ett annat problem 

- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
SV: Hjälp med Bash
Det var inte min tanke heller. Det är betyligt mer än $0 somBarre skrev:sant... men frågan var ju faktiskt Bash... som tråden heter... "Hälp med Bash".DrKonservburk skrev:Det är dock bra att veta att $0 inte är tillförlitlig.Barre skrev:
$0 är variablen som innehåller scriptnamnet..
Den kan vara lite vad som helst beroende på vilken
skal-version man använder och hur skripet startades
Tyckte det kändes onödigt att ta upp att sh ksh och andra skal kanske inte fungerar då![]()
kanske inte fungerar om vi går in på andra skal än bash.
Men det är faktiskt så att $0 inte alltid innehåller sökvägen
till skriptet även när det gäller enbart bash.
Ett par exempel där "bash$ " är prompten...
Kod: Markera allt
bash$ echo 'echo \$0: $0' >./skript.bash
bash$ bash ./skript.bash
$0: ./skript.bash
bash$ bash <./skript.bash
$0: bash
bash$ bash -c '. ./skript.bash' foo
$0: foo
bash$ ln -s /bin/bash ./foo
bash$ cat ./skript.bash | ./foo
$0: ./foo
Kod: Markera allt
bash$ cat <<\EOF >./skript.bash
#!/bin/bash
test -t 0 && exec -a /dev/null /bin/bash <$0
echo \$0: $0
EOF
bash$ chmod +x ./skript.bash
bash$ ./skript.bash
$0: /dev/null
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
SV: Hjälp med Bash
Mange Muck skrev: 2. Fördefinierad read
Få "read VAR" att visa ett redan inställt värde, vilket man kan ändra istället för att skriva in ett nytt värde från scratch. Detta är som jag har TÄNKT att det borde fungera:borde visaKod: Markera allt
TEXT="Hej Gunnar" echo "Är detta välkomsttexten du vill ha?" read TEXT echo TEXT
Kod: Markera allt
Är detta välkomsttexten du vill ha? Hej Gunnar <- Redigerbar
Jag tror inte just read klarar av det bara så där. Min första tankeMange Muck skrev: finns det inget alternativ där man kan låta read redan ha en sträng skriven?
var att man borde kunna använda en vanlig "read" och på något
smart sätt lura den att det direkt kommer ett gäng helt vanliga
tangenttryckningar, och sedan får den vänta på fler.
Men jag vet inte alls om det faktiskt går att göra så, och hur man
isf skulle göra det.
Däremot vet jag att man kan göra en wrapper-funktion runt read
så att det fungerar ungefär som du vill, men den blir nog inte
speciellt vacker.
SV: Hjälp med Bash
Vad menas med wrapper?
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
SV: Hjälp med Bash
Det är engelska. På svenska blir det nog "hölje" eller "omslag"Mange Muck skrev: Vad menas med wrapper?
eller något liknande. "candy wrapper" - "godispapper"
I det här fallet menar jag en skal-funktion som fungerar som
ett skyddande hölje runt ett annat kommando.
Exempelvis:
Kod: Markera allt
xterm()
(
echo "Du startade just xterm"
exec xterm
)
Kod: Markera allt
alias rm='rm -i'
Senast redigerad av 1 Konservburk, redigerad totalt 18 gånger.
SV: Hjälp med Bash
Ah, okej. Får fundera lite 

- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
SV: Hjälp med Bash
Det man får göra är att låta read läsa tecken för tecken
istället för hela rader åt gången. Och när det t.ex. kommer
ett backspace så tar man bort ett tecken ifrån sin variabel,
där man i vanliga fall lägger till tecknet som read läste in.
Behöver du hjälp så kan jag komma med förslag på hur
det skulle kunna se ut kodmässigt.
istället för hela rader åt gången. Och när det t.ex. kommer
ett backspace så tar man bort ett tecken ifrån sin variabel,
där man i vanliga fall lägger till tecknet som read läste in.
Behöver du hjälp så kan jag komma med förslag på hur
det skulle kunna se ut kodmässigt.
SV: Hjälp med Bash
Det är inte så viktigt nu, eftersom jag har gjort om lite. Istället skulle jag vilja ha hjälp med hur man kan lista endast kataloger i en variabel? Detta var vad du gav mig förrut (modifierad):
Hur kan man nu göra så att den listar mappar? Alltså träffar utan ändelse.
Kod: Markera allt
filter=(${DIR}/*)
FOLDERS="$DIR ${filter[*]}"
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
SV: Hjälp med Bash
Det går att lista allt utan ändelser, men det är inteMange Muck skrev: Hur kan man nu göra så att den listar mappar? Alltså träffar utan ändelse.
någon bra idé eftersom vanliga filer inte alls behöver
ha filändelser, och kataloger faktiskt kan ha filändelser.
Istället kan man anväda kommandot test:
Kod: Markera allt
if test -d "$FIL"
then
echo "Filen är en katalog"
else
echo "Filen är inte en katalog"
fi
så är det kommandot find man vill anväda sig av.
Kod: Markera allt
find * -maxdepth 0 -type d
Senast redigerad av 1 Konservburk, redigerad totalt 18 gånger.
SV: Hjälp med Bash
Herregud vad mycket jag frågar, men hur ska man kunna exportera detta till en variabel nu då?
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
SV: Hjälp med Bash
Kod: Markera allt
FOLDERS=`find * -maxdepth 0 -type d`
Kod: Markera allt
FOLDERS=$(find * -maxdepth 0 -type d)
KDE 4.5 SC är ute i det fria!!! Tjoho
Stagnation is good for nobody - after all if you don't progress you end up with gnome
Stagnation is good for nobody - after all if you don't progress you end up with gnome
SV: Hjälp med Bash
Tackar 
Nu kan jag inte komma på mer saker som jag vill ha svar på...

Nu kan jag inte komma på mer saker som jag vill ha svar på...

- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
SV: Hjälp med Bash
Problemet med att spara filnamn i en vanlig variabel ärmcNisse skrev:Kod: Markera allt
FOLDERS=`find * -maxdepth 0 -type d`
att det går åt PIPSVÄNGEN när det finns mellanslag eller
annat skräp i något av filnamnen.
Ska man nödvändigtvis mellanlagra sina filnamn i variabler
är det bättre att använda en array.
Kod: Markera allt
array=(*)
att separera filnamnen med nolltecken eftersom det är det
enda tecknet som inte kan finnas i själva filnamnen.
Och vill man som sagt mellanlagra filnamnen i en variabel
så får man bygga sin array i en loop över dessa nolltecken.
Kod: Markera allt
unset array
while read -rd ''
do array[${#array}]="$REPLY"
done < <(find . -maxdepth 1 -type d -path ./\* -printf %P\\0)
eller alla på en gång (och t.ex. loopa över dessa).
Kod: Markera allt
echo : "${array[0]}"
echo : "${array[1]}"
echo : "${array[@]}"
for var in "${array[@]}"
do echo : "$var"
done
SV: Hjälp med Bash
Jag har lärt mig BRA MYCKET mer än vad som var tänkt när jag startade tråden. Det värsta är att jag har nytta av allt också... 

- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
SV: Hjälp med Bash
Precis, mellanslag i namn ska undvikas.Problemet med att spara filnamn i en vanlig variabel är
att det går åt PIPSVÄNGEN när det finns mellanslag eller
annat skräp i något av filnamnen.
KDE 4.5 SC är ute i det fria!!! Tjoho
Stagnation is good for nobody - after all if you don't progress you end up with gnome
Stagnation is good for nobody - after all if you don't progress you end up with gnome
SV: Hjälp med Bash
Ny fråga 
Hur skriver man en fil? gedit?

Hur skriver man en fil? gedit?
- mcNisse
- Inlägg: 5211
- Blev medlem: 06 feb 2007, 20:51
- OS: Debian
- Utgåva: Vet inte/ingen utgåva passar
SV: Hjälp med Bash
Det finns massor med editorer... vi, kate, gedit, nano, pico, emacs mm.
KDE 4.5 SC är ute i det fria!!! Tjoho
Stagnation is good for nobody - after all if you don't progress you end up with gnome
Stagnation is good for nobody - after all if you don't progress you end up with gnome
SV: Hjälp med Bash
Jag menar med ett kommando 

SV: Hjälp med Bash
redirect till en fil.
echo KalleKalas > /tmp/nyfil
kommer att tömma /tmp/nyfil om det är text i den, om den inte finns skapas filen och KalleKalas kommer att skrivas i den.
echo KalleKalas2 >> /tmp/nyfil kommer att göra en "append", d.v.s fylla på filen med Kallekalas2.
Det går alltså att "styra" all text som skulle komma till skärmen till en fil istället med hjälp av > och >>
t.ex.
ls -l / >> /tmp/nyfil
echo KalleKalas > /tmp/nyfil
kommer att tömma /tmp/nyfil om det är text i den, om den inte finns skapas filen och KalleKalas kommer att skrivas i den.
echo KalleKalas2 >> /tmp/nyfil kommer att göra en "append", d.v.s fylla på filen med Kallekalas2.
Det går alltså att "styra" all text som skulle komma till skärmen till en fil istället med hjälp av > och >>
t.ex.
ls -l / >> /tmp/nyfil
________________________________________________________________
twitter @ BarreGargamel
blogg @ Gargamel.NU
twitter @ BarreGargamel
blogg @ Gargamel.NU
SV: Hjälp med Bash
sen kan du alltid skilja på "standard out" (som oftast är skärmen) och "standard error" (som också oftast är skärmen)..
stdout (standard output) representeras som filedescriptor 1 och stderr (standard error) representeras som filedescriptor 2
så, om du skulle t.ex göra så här:
rm -R ~/tmp 2>/tmp/error.log
så kommer "vanlig informativ text" att skickas till skärmen, medans rena fel (errors) kommer att skrivas till /tmp/error.log
rm -R ~/tmp >/tmp/standard.log
då kommer all "vanlig informativ text" skrivas till /tmp/standard.log medans rena fel (errors) kommer att skrivas till skärmen
rm -R ~/tmp >/tmp/standard.log 2>&1
2>&1 menas med att stderr kommer att skriva till samma ställe som stdout, dv.s /tmp/standard.log i detta exempel och ingen text kommer att skrivas till skärmen.
stdout (standard output) representeras som filedescriptor 1 och stderr (standard error) representeras som filedescriptor 2
så, om du skulle t.ex göra så här:
rm -R ~/tmp 2>/tmp/error.log
så kommer "vanlig informativ text" att skickas till skärmen, medans rena fel (errors) kommer att skrivas till /tmp/error.log
rm -R ~/tmp >/tmp/standard.log
då kommer all "vanlig informativ text" skrivas till /tmp/standard.log medans rena fel (errors) kommer att skrivas till skärmen
rm -R ~/tmp >/tmp/standard.log 2>&1
2>&1 menas med att stderr kommer att skriva till samma ställe som stdout, dv.s /tmp/standard.log i detta exempel och ingen text kommer att skrivas till skärmen.
________________________________________________________________
twitter @ BarreGargamel
blogg @ Gargamel.NU
twitter @ BarreGargamel
blogg @ Gargamel.NU