Sida 2 av 3
SV: Hjälp med Bash
Postat: 17 maj 2007, 17:27
av Magnuntu
Inte riktigt det jag tänkte på, men det hjälpte mig med ett annat problem

SV: Hjälp med Bash
Postat: 18 maj 2007, 12:13
av Konservburk
Barre skrev:
DrKonservburk skrev:
Barre skrev:
$0 är variablen som innehåller scriptnamnet..
Det är dock bra att veta att $0 inte är tillförlitlig.
Den kan vara lite vad som helst beroende på vilken
skal-version man använder och hur skripet startades
sant... men frågan var ju faktiskt Bash... som tråden heter... "Hälp med Bash".
Tyckte det kändes onödigt att ta upp att sh ksh och andra skal kanske inte fungerar då
Det var inte min tanke heller. Det är betyligt mer än $0 som
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
SV: Hjälp med Bash
Postat: 18 maj 2007, 12:26
av Konservburk
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:
Kod: Markera allt
TEXT="Hej Gunnar"
echo "Är detta välkomsttexten du vill ha?"
read TEXT
echo TEXT
borde visa
Kod: Markera allt
Är detta välkomsttexten du vill ha?
Hej Gunnar <- Redigerbar
Mange Muck skrev:
finns det inget alternativ där man kan låta read redan ha en sträng skriven?
Jag tror inte just read klarar av det bara så där. Min första tanke
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
Postat: 18 maj 2007, 13:24
av Magnuntu
Vad menas med wrapper?
SV: Hjälp med Bash
Postat: 18 maj 2007, 14:21
av Konservburk
Mange Muck skrev:
Vad menas med wrapper?
Det är engelska. På svenska blir det nog "hölje" eller "omslag"
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
)
Även detta enkla alias är en
wrapper, runt
rm:
SV: Hjälp med Bash
Postat: 18 maj 2007, 14:33
av Magnuntu
Ah, okej. Får fundera lite

SV: Hjälp med Bash
Postat: 18 maj 2007, 14:46
av Konservburk
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.
SV: Hjälp med Bash
Postat: 18 maj 2007, 14:55
av Magnuntu
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):
Kod: Markera allt
filter=(${DIR}/*)
FOLDERS="$DIR ${filter[*]}"
Hur kan man nu göra så att den listar mappar? Alltså träffar utan ändelse.
SV: Hjälp med Bash
Postat: 18 maj 2007, 15:06
av Konservburk
Mange Muck skrev:
Hur kan man nu göra så att den listar mappar? Alltså träffar utan ändelse.
Det går att lista allt utan ändelser, men det är inte
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
Men om man från början bara tänkt hitta kataloger
så är det kommandot
find man vill anväda sig av.
SV: Hjälp med Bash
Postat: 18 maj 2007, 15:11
av Magnuntu
Herregud vad mycket jag frågar, men hur ska man kunna exportera detta till en variabel nu då?
SV: Hjälp med Bash
Postat: 18 maj 2007, 15:38
av mcNisse
eller
Den första varianten anser jag vara mer portabel....
SV: Hjälp med Bash
Postat: 18 maj 2007, 15:49
av Magnuntu
Tackar
Nu kan jag inte komma på mer saker som jag vill ha svar på...

SV: Hjälp med Bash
Postat: 18 maj 2007, 16:17
av Konservburk
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.
Ska man nödvändigtvis mellanlagra sina filnamn i variabler
är det bättre att använda en array.
Om man använder
find och liknande är det bäst att se till
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)
Sedan kan man lätt komma man åt de individuella filnamnen,
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
Postat: 18 maj 2007, 16:20
av Magnuntu
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å...

SV: Hjälp med Bash
Postat: 18 maj 2007, 16:50
av mcNisse
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.
Precis, mellanslag i namn ska undvikas.
SV: Hjälp med Bash
Postat: 18 maj 2007, 17:47
av Magnuntu
Ny fråga
Hur skriver man en fil? gedit?
SV: Hjälp med Bash
Postat: 18 maj 2007, 19:21
av mcNisse
Det finns massor med editorer... vi, kate, gedit, nano, pico, emacs mm.
SV: Hjälp med Bash
Postat: 18 maj 2007, 19:23
av Magnuntu
Jag menar med ett kommando

SV: Hjälp med Bash
Postat: 18 maj 2007, 19:27
av Barre
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
SV: Hjälp med Bash
Postat: 18 maj 2007, 19:34
av Barre
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.