.profile

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

.profile

Inlägg av Johnny Rosenberg »

Kanske egentligen fel ställe att fråga, då mitt exempel gäller min Eee PC som har Mandriva Linux Free 2009.0, men jag orkar inte vara medlem på alla forum som finns… och detta är kanske mer specifikt för Linux i största allmänhet än bara Mandriva:

Jag upptäckte att /sbin inte ingick i PATH i min Mandriva-installation, så jag gick in och pillade dit följande rader i .profile:

Kod: Markera allt

if [ -d "/sbin" ] ; then
   PATH="/sbin:$PATH"
fi
Innan ändringen hade PATH följande värde:

Kod: Markera allt

/bin:/usr/bin:/usr/local/bin:/usr/games:/usr/lib/qt4/bin
Efter ändringen blev det istället så här:

Kod: Markera allt

/sbin:/sbin:/bin:/usr/bin:/usr/local/bin:/usr/games:/usr/lib/qt4/bin
Kommenterade raderna, loggade ut och sedan in igen, och ingen /sbin var med.
Avkommenterade raderna igen, loggade ut och in, samma sak igen. Jag kan inte för mitt liv se vad det är som gör att jag får med /sbin två gånger. Kan ni? Inte för att det gör så mycket, men man vill ju veta…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
tergo
Inlägg: 90
Blev medlem: 15 okt 2007, 23:35
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: .profile

Inlägg av tergo »

Vilken .profile roots ?

lägg till "~" = /home/user

if [ -d "~/sbin" ] ; then
PATH="~/sbin:$PATH"
fi
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: .profile

Inlägg av Osprey »

Spelar ingen roll om det är roots .profile eller vems det är, problemet är antagligen att .profile genomlöps mer än en gång...

Prova med:

Kod: Markera allt

if [[ $(echo $PATH | awk '{ i=index($1,"sbin"); print i }') != 0 ]];
    then
    if [ -d "/sbin" ] ; then
        PATH="/sbin:$PATH"
    fi
fi
I koden ovan kollar du först så att PATH inte redan innehåller "sbin".

[Edit] Iofs borde det inte spela någon roll om PATH innehåller sbin två gånger, men det drar ju ner prestanda något... :)
[Edit] Och eftersom det är "/sbin" vi pratar om så går det inte att ange "~/sbin" allt blir liksom helt fel då...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: .profile

Inlägg av Johnny Rosenberg »

tergo skrev:Vilken .profile roots?
Nej, $HOME/.profile var det i detta fall. Editerar helst bara filer i $HOME, annars försvinner ju ändå bara ändringarna om jag exempelvis skulle få för mig att installera en annan distro. Har ju, som de flesta andra, /home på en egen partition.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: .profile

Inlägg av Johnny Rosenberg »

Osprey skrev:Spelar ingen roll om det är roots .profile eller vems det är, problemet är antagligen att .profile genomlöps mer än en gång...

Prova med:

Kod: Markera allt

if [[ $(echo $PATH | awk '{ i=index($1,"sbin"); print i }') != 0 ]];
    then
    if [ -d "/sbin" ] ; then
        PATH="/sbin:$PATH"
    fi
fi
I koden ovan kollar du först så att PATH inte redan innehåller "sbin".

[Edit] Iofs borde det inte spela någon roll om PATH innehåller sbin två gånger, men det drar ju ner prestanda något... :)
[Edit] Och eftersom det är "/sbin" vi pratar om så går det inte att ange "~/sbin" allt blir liksom helt fel då...
Tanken att $HOME/.profile körs mer än en gång har slagit mig, men jag kom inte på något bra sätt att kolla det.
OM det är så, är det då inte bättre att se till att så inte sker? Jag tänkte mig att .profile kunde skapa en variabel och sätta den till något. Innan den gör det skulle den kunna kolla om variabeln finns och om den är satt till detta värde. Om så är fallet, hoppa ur skriptet. Då slipper man ju det mesta av filen andra gången. Kan man kolla om en variabel existerar?

En annan variant är ju att jag gör en sökning på hårddisken efter skript som startar $HOME/.profile. Om det visar sig att två olika skript gör det, kan jag kanske ta bort den raden i ett av dem…

Jag är ju lite nybörjare, så jag tänkte bara att man kunde bolla lite idéer och se om det leder någonstans… Är övertygad om att din lösning funkar dock, men ändå vill jag ju veta VARFÖR skriptet körs två gånger…

Tack för snabba svar!
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: .profile

Inlägg av David Andersson »

Osprey skrev:

Kod: Markera allt

if [[ $(echo $PATH | awk '{ i=index($1,"sbin"); print i }') != 0 ]];
    then
    if [ -d "/sbin" ] ; then
        PATH="/sbin:$PATH"
    fi
fi
Går att göra mer läsbar kod

Kod: Markera allt

if [ -z $(expr "$PATH" : ".*\(/sbin\)") ]; then
    if [ -d "/sbin" ] ; then
        PATH="/sbin:$PATH"
    fi
fi
eller mindre läsbar (och inte kompatibel med sh)

Kod: Markera allt

if ! grep -q "/sbin" <<<"$PATH"; then
    if [ -d "/sbin" ] ; then
        PATH="/sbin:$PATH"
    fi
fi
men det enklaste är nog att låta det vara två /sbin i PATH. Det är inte farligt.

Tror också att .profile körs två gånger i detta fall. Idealt tror jag .profile ska köras en gång när man loggar in och .bashrc en gång för varje ny terminal (skal), men det kan hända att en av dem dessutom anropar den andra, eller vise versa. Kolla vad som står i ~/.bashrc eller om det finns en ~/.bash_profile eller ~/.bash_login.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: .profile

Inlägg av Osprey »

Det kan vara många olika komponenter som kör .profile och den ena kan vara anropad av den andra och detta gäller för övrigt t.ex .bashrc också. Den idé som du nämner är enkel och effektiv och just den som används i alla .h filer i C/C++.

Kod: Markera allt

#ifndef already-run
#define already-run
  [...]
  Do something
  [...]
#endif
Där "already-run" oftast är namnet på själva filen.

Din lösning har dock en stor brist. Den funkar bra om scriptet (.profile i det här fallet) bara ska definiera konstanter som PATH och lite annat, men om .profile också gör något mer aktivt vilket inte alls är så ovanligt, så kan det vara nödvändigt att detta görs varje gång den genomlöps...

Därför ska man alltid utforma .profile, .bashrc, .cshrc (och vad man nu har) så att de är reentranta eller med andra ord så att de klarar av att köras flera gånger om... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
tergo
Inlägg: 90
Blev medlem: 15 okt 2007, 23:35
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: .profile

Inlägg av tergo »

Får man köra if på en root portfölj?
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: .profile

Inlägg av Osprey »

tergo skrev:Får man köra if på en root portfölj?
Menar du om det går att köra "if (roots-mapp-exists)" eller? Isåfall, jodå det går alldeles utmärkt att köra "if" på precis allting i hela systemet, men vissa saker kanske man inte har rättighet att se. Alla mappar som ligger på root-nivå ("/") har man dock rätt att se, likaväl som man kan se allt som ligger i dem. Däremot har man inte rättighet att ändra i dem och vissa filer (som t.ex /etc/shadow) kan man inte heller se innehållet i...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Skriv svar

Återgå till "Terminalforum"