Hjälp med Bash

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg av Magnuntu »

Inte riktigt det jag tänkte på, men det hjälpte mig med ett annat problem  :o
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: Hjälp med Bash

Inlägg 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
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: Hjälp med Bash

Inlägg 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.
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg av Magnuntu »

Vad menas med wrapper?
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: Hjälp med Bash

Inlägg 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:

Kod: Markera allt

alias rm='rm -i'
Senast redigerad av 1 Konservburk, redigerad totalt 18 gånger.
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg av Magnuntu »

Ah, okej. Får fundera lite :)
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: Hjälp med Bash

Inlägg 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.
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg 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.
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: Hjälp med Bash

Inlägg 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.

Kod: Markera allt

find * -maxdepth 0 -type d
Senast redigerad av 1 Konservburk, redigerad totalt 18 gånger.
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg av Magnuntu »

Herregud vad mycket jag frågar, men hur ska man kunna exportera detta till en variabel nu då?
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
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

Inlägg av mcNisse »

Kod: Markera allt

FOLDERS=`find * -maxdepth 0 -type d`
eller

Kod: Markera allt

FOLDERS=$(find * -maxdepth 0 -type d)
Den första varianten anser jag vara mer portabel....
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
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg av Magnuntu »

Tackar :)

Nu kan jag inte komma på mer saker som jag vill ha svar på... :P
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: Hjälp med Bash

Inlägg av Konservburk »

mcNisse skrev:

Kod: Markera allt

FOLDERS=`find * -maxdepth 0 -type d`
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.

Kod: Markera allt

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
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg 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å... :P
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
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

Inlägg 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.
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
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg av Magnuntu »

Ny fråga :P

Hur skriver man en fil? gedit?
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
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

Inlägg av mcNisse »

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
Magnuntu
Inlägg: 134
Blev medlem: 12 apr 2007, 12:05
OS: Annat GNU/Linux
Ort: Karlstad

SV: Hjälp med Bash

Inlägg av Magnuntu »

Jag menar med ett kommando :)
Vill du ha en Linuxtidning? Skriv under här!
Musik som du aldrig har hört den förr
Användarvisningsbild
Barre
Inlägg: 2298
Blev medlem: 13 dec 2006, 10:23
OS: Ubuntu
Ort: Stockholm
Kontakt:

SV: Hjälp med Bash

Inlägg 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
________________________________________________________________
twitter @ BarreGargamel
blogg @ Gargamel.NU
Användarvisningsbild
Barre
Inlägg: 2298
Blev medlem: 13 dec 2006, 10:23
OS: Ubuntu
Ort: Stockholm
Kontakt:

SV: Hjälp med Bash

Inlägg 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.
________________________________________________________________
twitter @ BarreGargamel
blogg @ Gargamel.NU
Skriv svar

Återgå till "Terminalforum"