Enklaste bash skriptet nånsin..fungerar inte

Trädvy Permalänk
Medlem
Registrerad
Jul 2005

Enklaste bash skriptet nånsin..fungerar inte

Hej alla kunniga!

så..då har jag skrivit x antal bash skripts, varav många rätt avancerade i mina ögon, men nu är det något ofattbart fel som gör att det enklaste kommandot inte fungerar

#!/bin/bash cd /home/$1/Skrivbord

skriptet är såklart körbart för min användare:
bash asdf.sh stefan

jag vill enbart att programmet ska gå in i katalogen /home/stefan/Skrivbord
men det fungerar inte, och jag känner mig helt dumförklarad.

Det fungerar inte att gå in i någon annan katalog heller för den delen, som ligger i /home/stefan

och kör jag
bash asdf.sh stefan 2> error.log
eller
./asdf.sh stefan 2> error.log

och kollar loggen så är loggen helt tom, det borde ha fungerat men fungerar inte hur jag än gör.

Jag kör Mint 18.1 btw.

Trädvy Permalänk
Medlem
Registrerad
Mar 2010

Det funkar inte därför att kommandot körs i ett underskal och ändrar katalog i det, inte i det skalet du står i för närvarande. Om du vill exekvera ett kommando i det nuvarande skalet kör du det med kommandot source istället

Så istället för
bash asdf.sh
eller
./asdf.sh
kör du
source asdf.sh

Att skript vanligen exekveras i underskal görs troligen för att variabler då nollställs vid varje ny körning, eller om kommandot "exit" används i skriptet så dödar det inte ditt nuvarande skal, utan bara skriptet.

Ett annat alternativ om du inte vill använda source-kommandot är att du definierar ditt skript som en funktion i din ~/.bashrc

d.v.s.

function asdf { cd /home/$1/Skrivbord }

längst ner i din ~/.bashrc.
Så kan du anropa enbart med
asdf

Så körs kommandot i ditt nuvarande skal.
Notera också att ~/.bashrc läses in när du startar ett nytt skal, så du får starta om terminalen efter att du sparat ändringarna i filen.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2015

@Lexdale: Vad fungerar inte? Hur vet du att scriptet inte går in i rätt sökväg? Vad händer om du gör t.ex. (cd /home/$1/Skrivbord && ls -l) i scriptet?

Edit: såg att någon hann före med att förklara att allt du gör i scriptet körs i eget shell, så när det är slutkört kommer du tillbaka till ditt shell som ju är kvar i den gamla sökvägen.

Stationär: i7-6700k, Asus Strix 1080 Ti 32 GB G.Skill TridentZ, Define Mini C TG Laptop: Lenovo Yoga 3 Pro Core M 5Y71 Tablet: Surface Pro 3 i7-4650U

Trädvy Permalänk
Medlem
Registrerad
Jul 2005
Skrivet av Edge1:

@Lexdale: Vad fungerar inte? Hur vet du att scriptet inte går in i rätt sökväg? Vad händer om du gör t.ex. (cd /home/$1/Skrivbord && ls -l) i scriptet?

Edit: såg att någon hann före med att förklara att allt du gör i scriptet körs i eget shell, så när det är slutkört kommer du tillbaka till ditt shell som ju är kvar i den gamla sökvägen.

Citat:

#!/bin/bash

cd /home/$1/Skrivbord && ls -l

eller
cd /home/$1/Skrivbord && pwd

Ja nu ser jag ju att skriptet faktiskt går in där, men jag hänger inte med på varför inte jag får stanna kvar där för?

Och hur menar ni att skriptet körs i eget shell,

skriver jag tex:

Citat:

#!/bin/bash

sudo apt-get install gedit

så ser jag ju allting som sker

Nu måste jag vara riktigt trött då jag har hängt upp mig på denna lilla detalj

Trädvy Permalänk
Medlem
Registrerad
Mar 2010
Skrivet av Lexdale:

eller
cd /home/$1/Skrivbord && pwd

Ja nu ser jag ju att skriptet faktiskt går in där, men jag hänger inte med på varför inte jag får stanna kvar där för?

Och hur menar ni att skriptet körs i eget shell,

skriver jag tex:

så ser jag ju allting som sker

Nu måste jag vara riktigt trött då jag har hängt upp mig på denna lilla detalj

Ja, det är klart det syns när du kör apt-get, men när skriptet kommit förbi sista raden stängs underskalet av och återvänder till skalet över. Underskalet hinner inte skriva ut något på skärmen då det enda som skriptet gör är att köra cd-kommandot, vilket i sig inte producerar någon output.

Du kan göra följande test för att få lite känsla om vad jag pratar om:

Öppna en terminal
skriv exit, tryck enter
terminalen stängs, som du säkert gissade

Öppna nu en ny terminal
skriv bash, tryck enter
skriv bash igen, tryck enter
skriv bash igen, tryck enter

sen skriver du exit och trycker enter, upprepa det tills terminalen stängs igen

Där har du principen med underskal. Skillnaden är att underskalet förblir öppet om du bara kör "bash" utan argument, medan skriptet stänger underskalet automatiskt när det är färdigt.

Eller om du har sett filmen Inception så är det en ganska bra liknelse, fast istället för en dröm i en dröm i en dröm, så rör det sig om ett skal i ett skal i ett skal

Trädvy Permalänk
Medlem
Registrerad
Jul 2005

Inception haha... Jag visste att det var något enkelt fel eller nån slags synvilla ! Jag var bara för trött för att genomskåda luringen!

Tack för hjälpen, jag hänger med nu!
Det jag ville göra bland annat var att gå in i /home/$1/Skrivbord
och ladda ned en bild. Och sedan gå tillbaka till /home/$1
och fortsätta köra resten av all kod

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2015

@s0sdaf: Om TS är trött kanske man inte ska likna bashscripting vid Inception

OnT: Som ovanstående inlägg förklarar har varje instans av bash sitt eget environment, och därmed också sin egen sökväg/cwd. Du kan ju se varje process cwd i /proc/<pid>/cwd som symlänk, t.ex. Så funkar för övrigt de flesta skal, tänk dig att du i Windows startar Explorer.exe och går till C:\Windows, och dubbelklickar på Explorer.exe igen så ett nytt fönster öppnas. I det nya fönstret navigerar du sen till C:\Users, sen stänger du det fönstret. Originalfönstret står ju kvar i C:\Windows som det var i senast, allt annat skulle ju leda till anarki i datorn

Om du någonsin försökt skriva om en Unix-daemon som är utformad att använda fork/exec-semantik för att hantera många användare samtidigt, till att använda trådar i samma process istället, vet du redan hur jobbigt det kan bli. Gör om ditt script till att fungera "kring" sökväg/process-utformningen.

Stationär: i7-6700k, Asus Strix 1080 Ti 32 GB G.Skill TridentZ, Define Mini C TG Laptop: Lenovo Yoga 3 Pro Core M 5Y71 Tablet: Surface Pro 3 i7-4650U