Gå till innehåll
Just nu i M3-nätverket

Terminalen: arbetsmiljö och grunder


xeric

Rekommendera Poster

Det här inlägget/tråden är tänkt att bli en genomgång av Terminal och f f a hur man skapar sig en bra arbetsmiljö men hjälp av olika .bash_filer och foldrar. Också för att vid senare tillfällen kunna ha som referens om man skriver nåt, delar med sig av ett skript/program - att kunna hänvisa till denna tråd hur och var saker ligger.

Tanken med tråden är också att inspirera lite att kunna/lära sig mer sen.

 

Det är 4-5 (halvlånga) inlägg först, som kan verka/se lite mastiga ut, men det är mer text/läsning än vad det är att göra s a s. Har funderat på det här inlägget ganska länge nu (sen ≈ 2014), hur man skall få till ett bra upplägg. Så, med reservation för ev justeringar vid behov. Det kan t ex vara något ni sett/ser som skulle behöva omformuleras el nåt sånt. Ok, nu kör vi...

- - -

 

Terminal och arbetsmiljö

 

Även om man inte använder Terminal så mycket (el alls), så är det bra att ha en bra miljö att jobba i. Kan tyckas vara lite överkurs kanske - men den dagen man behöver installera ett skript/program eller lägga till något i sina olika .bash_filer så är det både bättre och enklare.

F f a så när man börja lägga till saker i t ex .bash_profile - den som redan lagt till något där vet att det kan bli ganska plottrigt där efter bara ett litet tag. Så tanken här är att visa hur man på ett enkelt sätt kan dela upp innehållet på fler filer, och på så sätt få en mycket mer strukturerad miljö att jobba i.

Och som sagt, även om man ointe är så mycket i Terminal och håller på, så kan det vara ett bra sätt att lägga upp det på. Och om inte annat får man lite inblick/översyn på hur saker fungerar.


Bashfiler

När man startar Terminal, så läses ett antal filer in. Allt för att Terminal skall kunna hitta/visa saker på rätt sätt. Det är olika sökvägar, variabler osv.

Det finns ett antal olika systemfiler + de man kan (med fördel) lägga till själv. De lägger man i sin hemfolder, och de börjar med en . och är osynliga i Finder (om man nu inte gjort dolda filer synliga).

Här är en lista på de filerna, och i vilken ordning de läsas in:

/etc/profile
.bash_profile
.bash_login
.profile
.bashrc
.bash_logout

Läs mer... http://www.itiseezee.com/?p=239 , http://ss64.com/osx/syntax-bashrc.html


I OS X/macOS användes .bashrc förr, men den känns inte av automatiskt längre. Den är vanligare i Linux/*BSD-miljö att man använder som sin egen fil. Men det går att ordna. :)

Den vanligaste filen som används, och som nämns oftast då man ombeds att lägga till något, t ex till PATH är filen .bash_profile. Det går lika bra att använda .profile, men jag tycker att det är bra att man använder .bashrc istället. Dels för att det är ett kortare och enklare namn - lättare att skriva, och mycket för att de flesta guider ni ev kommer att stöta på är inte för OS X och de kommer att nämna .bashrc istället. Som ovan kanske man blir frågande - vilken fil skall man egentligen ha? Ja, alla är eg samma, gör samma, så det är lite som man själv vill. Bara man har kollen själv s a s.


Egen setup.

Så, börja med att skapa en .bashrc. Det kommer att bli filen vi utgår från, hela tiden. Det blir basen s a s.

Så, starta Terminal, och skapa filerna (om de inte redan finns) och sen öppna de med textredigeraren:

touch ~/.bash{rc,_profile}
open -e ~/.bash{rc,_profile}

'~' är hemfoldern.

Om det redan finns innehåll i .bash_profile - kopiera över det till .bashrc. Och i .bash_profile... Klistra in detta och sen spara->stäng.

#
# ~/.bash_profile
#
# Använd ~/.bashrc istället.
# Här laddas bara den in.
#

# Ladda in: .bashrc
[ -f ~/.bashrc ] && . ~/.bashrc

Det är alltid bra att börja en fil med några rader med information, i det här fallet, vad filen heter, och sen en kommentar.

Sista raden där, Den kollar om filen finns, och i sånt fall laddar in den (en punkt (.) är samma sak som att skriva source i det här sammanhanget).

Den filen är klar nu och inget mer kommer att hamna där. :yeahbaby:


I filen .bashrc... om den är tom - dvs du hade inget i den andra filen innan, så till att börja med - det enda du behöver klistra in där är:

#
# ~/.bashrc
#
# Alias och funktioner ligger i egna filer:
# (.bash_aliases and .bash_functions)
#
# Denna fil laddas in från ~/.bash_profile
#

Spara och stäng. Återkommer mer till den filen senare för att lägga in lite grunder där.


För att ladda in/om filerna i Terminal... Antingen starta om Terminal så läses de in, eller kör bara:

. ~/.bash_profile

# samma som
source ~/.bash_profile

I fortsättningen sen när man lägger till något eller ändrar, så är det .bashrc man ladda om.


Övriga filer

Med de 2 klara nu, så... Ja, de räcker så, och man klarar sig på dem, men för att dela upp det bättre och får till strukturen, så blir det ett gäng filer till. Eftersom det är dolda filer (med en punkt innan) så syns de ändå inte i Finder sen. :finder:

De xtra filer att skapa är:

.bash_aliases    # En fil för alias
.bash_exports    # En fil bara för olika 'export FOO' osv
.bash_functions  # En fil för funktioner
.bash_logout     # Om man vill ha något gjort när
                 # man loggar ut. (Körs bara om/när
                 # man skriver: exit)

I Terminal kör:

touch ~/.bash_{aliases,exports,functions,logout}

För att öppna filerna:

open -e ~/.bash_{aliases,exports,functions,logout}

Till en början så lägg till detta i respektive fil:

#
# ~/.bash_aliases
#
# Separat fil för olika alias.
#
# Ladda in den i ~/.bashrc med:
# ------------------------------------------------
# # Ladda in: .bash_aliases
# [ -f ~/.bash_aliases ] && . ~/.bash_aliases
# ------------------------------------------------
#
#
# ~/.bash_exports
#
# Separat fil för variabler och sökvägar
#
# Ladda in den i ~/.bashrc med:
# ------------------------------------------------
# # Ladda in: .bash_exports
# [ -f ~/.bash_exports ] && . ~/.bash_exports
# ------------------------------------------------
#
#
# ~/.bash_functions
#
# Separat fil för olika funktioner
#
# Ladda in den i ~/.bashrc med:
# ------------------------------------------------
# # Ladda in: .bash_functions
# [ -f ~/.bash_functions ] && . ~/.bash_functions
# ------------------------------------------------
#
#
# ~/.bash_logout
#

# Lägg "denna session" till historiken direkt
history -a ~/.bash_history

För den sista där, ligger det med en rad om att lägga till (-a = append) det man kört till historiken. Bara en bra-ha-grej.

När det är klart kan man spara och stänga alla filer.


- - -

Så, tillbaka till .bashrc nu... Det som skall läggas till nu är att ladda in de filer man nu gjort. I Terminal kör:

open -e ~/.bashrc

Och lägg till följande (informationen från de andra filerna) så att det tillsammans med det som var där tidigare blir:

#
# ~/.bashrc
#
# Alias och funktioner ligger i egna filer:
# (.bash_aliases and .bash_functions)
#
# Denna fil laddas in från ~/.bash_profile
#

# Ladda in: .bash_exports
[ -f ~/.bash_exports ] && . ~/.bash_exports


# det kommer mer/fler/andra saker här sen #


# Ladda in .bash_filer
# --------------------

# Ladda in: .bash_aliases
[ -f ~/.bash_aliases ] && . ~/.bash_aliases

# Ladda in: .bash_functions
[ -f ~/.bash_functions ] && . ~/.bash_functions

Sen i .bash_exports... Här ska vi även justera PATH.

PATH är de sökvägar som finns inlagda, som gör att den söker i de foldrarna efter saker man kör/skriver. Dvs när man t ex kör:

uname

...gör man det med programnamnet, istället för att behöva köra:

/usr/bin/uname

Systemet har redan ett gäng sökvägar definierade, dels en egen fil: /etc/paths, och sen även i de filer som läggs till i foldern /etc/path.d. De läses in automatiskt.

För att kolla vilka som finns där nu, kör:

echo $PATH

För att få lite bättre (och logiskare) ordning där så gör om den så de sökvägar som ligger i /usr/local hamnar före i ordningen. Det som skall läggas till är:

export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/xbin:$PATH"

På så sätt kommer de före i ordningen, och anledningen till det är helt enkelt för att om man ändå installerat nåt, som t ex redan finns i OS X/macOS så är det sannolikt för att man vill ersätta det programmet med en annan, kanske nyare, version. Så när man kör det (utan sökväg innan) så är det din egna version som kommer först då. Sökvägen /usr/local/xbin är inte standard. Återkommer till den senare. :)

Så, för att editera .bash_exports nu... I Terminal kör:

open -e ~/.bash_exports

Och lägg till så att det tillsammans med det som du la till där tidigare blir:

#
# ~/.bash_exports
#
# Separat fil för variabler och sökvägar
#
# Ladda in den i ~/.bashrc med:
# ------------------------------------------------
# # Ladda in: .bash_exports
# [ -f ~/.bash_exports ] && . ~/.bash_exports
# ------------------------------------------------
#

# Sökvägar + PATH
# --------------------

# xbin
_xbin="/usr/local/xbin"

# ShellScripts
_Sh="$HOME/ShellScripts"

# justera PATH
export PATH="/usr/local/bin:/usr/local/sbin:$_xbin$_Sh:$PATH"

# Spara alla "defaults ..." i en separat fil
export PROMPT_COMMAND='echo "$(history 1 | grep -E "(sudo)? defaults ")" | sed '/^$/d' >> $HOME/ShellScripts/__defaultsLog.txt'

# Inga .DS_Store osv i "tar"
export COPY_EXTENDED_ATTRIBUTES_DISABLE=true


# Färger
# --------------------
export CLICOLOR=1
export LSCOLORS=Exfxcxdxbxegedabagacad

# Markera ord i sökresultat (gul)
export GREP_COLOR='1;33'

# Färg i manualerna
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;38;5;75m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[0;38;5;246m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[04;38;5;83m'

I slutet där, även lite färger för terminalen, och för manualer. Och även en rad som gör att alla defaults write man kör hamnar i en egen fil. Väldigt smidigt att ha till hands när man gör en om/nyinstallation.

Spara och stäng.


- - -

Vid ett senare tillfälle kanske u installera nåt som har/lägger sig på ett eget ställe, då blir det väldigt enkelt att bara lägga till det där med en egen rad och sen lägga till det till PATH.

Exempel: När man installerar MySQL så hamnar det i: /usr/local/mysql/bin. För att lägga till den sökvägen... Antingen direkti den raden, men för läsabarhetens skull så det blir enklare... Skapa en egen rad med en variabel och sen lägg till den till den andra. Resultatet blir t ex:

# MySQL
_SQL="/usr/local/mysql/bin"

# xbin
_xbin="/usr/local/xbin"

# ShellScripts
_Sh="$HOME/ShellScripts"

# justera PATH
export PATH="$_SQL:/usr/local/bin:/usr/local/sbin:$_xbin$_Sh:$PATH"

Så ligger den först där i ordningen. Men, f f a mer lättläst och enklare att ta bort/justera om man vill/behöver. Man har bättre kontroll på det s a s.

- - -

Nu med den filen editerad och klar, så är det dags att ladda in allt.

. ~/.bashrc

Nu har du förhoppningsvis en bra lättöverskådlig setup, där det är enkelt att ändra/lägga till det man (ev) behöver sen, utan att man sitter med en enda lång jätteplottrig fil. :crossfingers:

- - -

 

Foldrar

 

Det som är kvar nu, innan det är helt klart, är att skapa några foldrar.

När man installerar saker själv, eller via installerare så hamnar det som regel i /usr/local. På senare tid är den foldern helt tom i ett nyinstallerat system, och programmen man installerar lägger ju till varteftersom, vid behöv - men, det kan vara bra att få viss ordning från början. Så i a f 3 foldrar kan du göra. I Terminal kör:

sudo mkdir -pv /usr/local/{bin,sbin,xbin}
mkdir -pv ~/ShellScripts

bin och sbin är 2st standarfoldrar. De 2 övriga är egna foldrar att kunna använda.

I ~/ShellScripts brukar jag lägga olika skripts man kör - i princip alla de som slutar med .sh som filändelse. Och i /usr/local/xbin - den har jag som egen skriptfolder, som global skriptfolder så alla användare på datorn kommer åt den. Även att om man skriver ett eget litet “program” så känns det bättre att lägga de där, än att blanda ihop de med “riktiga” program som man installerar/kompilera osv. Tycke och smak såklart, men det är enkelt och bra att ha ett eget litet krypin där. :) Så, om jag i ett annat inlägg sen skriver om ett skript och hänvisar till de 2 foldrarna, så vet ni varför.

Ja, det var klart så, så kommer det mer i följande inlägg lite om varje fil sen - men nu är hela setup'en klar. Oavsett om man sen “bor” i Terminal eller inte, så har man en bra utgångspunkt att jobba med. Förhoppningsvis så kan det inspirera lite till att “komma igång” att kika lite närmare på Terminal och vad man kan göra där, eller att man kanske har lärt sig något av det ovan. Något eller några frågetecken kanske har rätats ut.

Länk till kommentar
Dela på andra webbplatser

Alias och funktioner

Om man nu vill forts och börja att lägga till lite saker till sina filer, så finns det i a f några saker jag tycker att man bör ha där. Så här kommer några alias och funktioner man kan börja med, och så man ser vad det är för något, och hur man skriver.


Alias

Ett alias är precis vad det låter som. Ett namn som är istället för något annat. Oftast använder man det för att skapa sig kortkommandon av längre saker som kanske är svårare att komma ihåg, om inte annat jobbigare att skriva. :)

Syntaxen är enkel och ett alias kan se ut så här:

# syntax
alias foo='<här är det som foo skall göra>'

# exempel
alias ls='ls -G'

Med det aliaset kommer terminalen visa det den puttar ut med olika färger. Enklare att se vad som är vad s a s.

Så, här kommer ett gäng ni kan börja med, såna som är bra, enkla att ha. Lägg till det i filen ~/.bash_aliases och ladda om den sen.

 

# Fil- & foldrar
# --------------------

# Upp ett steg
alias ..='cd ..'

# Lägger till "-iv" till cp, mv, ln
# v = verbose. Visar i terminalen vad som händer
# i = interaktiv. Frågar t ex om att skriva över
alias mv='mv -iv'
alias cp='cp -iv'
alias ln='ln -iv'

# "-p" gör att den skapar foldrar ovasett om vägen
# fram dit finns eller inte
alias mkdir='mkdir -pv'

alias c='clear'
alias h='history'
alias x='exit'
alias q='exit'

# lista som en vanlig "ls"
alias ls='ls -G'

# visar bara dolda filer/foldrar
alias ls.='ls -d .*'

# listar allt i listform - inkl rättigheter, ägare, grupp, osv.
alias lsal='ls -Ahl'

# visa med "less" (egen skärm). Avsluta/gå ur med: q
alias lsless='ls -Ahl | less'

# visa färg i "grep"
alias grep='grep --color=auto'

# Visar PATH - varje PATH på varsin rad (mer lättläst)
alias lPath="echo $PATH | tr ':' '\n'"


# Städa/rensa
# --------------------

# Radera .DS_Store och ._filer
alias rmDS='find ./ "-name" ".DS_Store" -exec rm {} \;'
alias rmDF='find ./ "-name" "._*" -exec rm {} \;'

# Rensa DNS-cache (10.7/8/9)
alias flushDNS='sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder;'

# Rensa DNS-cache (10.10)
# Tror att det försvann sen och för senare använd den ovan.
# Read more: http://osxdaily.com/2008/03/21/how-to-flush-your-dns-cache-in-mac-os-x/
alias flushdns='sudo discoveryutil mdnsflushcache;sudo discoveryutil udnsflushcaches;'

# Lagar menyn "öppna med" om den visar dubletter
alias fixOW='/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user'

# Dropbox cachefolder (= man får mer utrymme tillbaka).
alias lsDbox='ls -Ahl ~/Dropbox/.dropbox.cache/'
alias rmDbox='rm -rf ~/Dropbox/.dropbox.cache/*'

# Läs den dolda nedladdingshistoriken
alias lsDL="sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV* 'select LSQuarantineDataURLString from LSQuarantineEvent' | uniq | more"

# Radera den dolda nedladdingshistoriken
alias rmDL="sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV* 'delete from LSQuarantineEvent'"


# Övrigt
# --------------------

# Vad har jag för IP?
alias myIP='dig +short myip.opendns.com @resolver1.opendns.com'

# Lista diskar
alias disklist="mount | grep 'disk'"

# Visa utrymme
alias diskspace='df -Hl'

# Varför går inte datorn i vila?
alias whatsOpen='pmset -g assertions'

# Lista inkopplad hårdvara
alias whatHW='networksetup -listallhardwareports'

# Starta skärmsläckaren manuellt
alias sse='open -a ScreenSaverEngine'

# Fuck
alias fuck='sudo $(history -p \!\!)'

# Öppna nuvarande foldern i Finder
alias oh='open .'

# Fixa rättigheter/ACL på en folder och dess innehåll (755/644)
alias fixACL='find ./ -type d -exec chmod -v 755 {} \; && find ./ -type f -exec chmod -v 644 {} \;'

 



En del ersätt redan befintliga, och andra är nya. Har försökt skriva en liten kommetar till varje så man ser vad de gör. Fråga annars!

Spara, stäng, och ladda om:

. ~/.bashrc



Funktioner

Till skillnad från alias är funktioner nästan lite samma sak, men man kan använda parametrar/variabler. I princip kan man säga att det är som små miniskript, utan att man gör en egen fil av dem. Får man väldigt stora funktioner, kanske man bör fundera på om man inte skall konvertera om funktionen till ett eget skript istället.

Funktioner är inte heller svåra att skriva, och syntaxen är enkel. Men, man kan skriva en funktion på ett mycket mer komplicerat sätt, om man vill. Men för enkelhetes skull så skippar vi det nu, såklart. :)

# syntax
function foo()
{
    # vad funktionen foo() skall göra
}

# exempel
function hgrep()
{
    history | grep "$1";
}

$1 representerar det första man skriver efter funktionens namn, $2 det andra osv. Så, kör man...

hgrep foo

...söker det i historiken efter ordet foo.

Notering: Man behöver inte skriva det med ordet function innan det räcker med foo().

function foo()
{
    # ...
}


foo()
{
    # ...
}

Båda är/gör samma sak. Men jag tycker det är bättre med att vara lite mer verbose, så ser man verkligen vad det är - och är man ny i Terminalen, så är det bra att lära sig det den vägen, så kan man ju själv senare när man är varm(are) i kläderna skippa det när man känner för det. Jag föredrar att skriva ut det.

Så, här kommer ett gäng funktioner ni kan börja med. Lägg till det i filen ~/.bash_functions och ladda om den sen.

 

# Skapar en folder och går (cd) direkt till den.
function mkdircd() { mkdir -pv "$1" && cd "$1"; }

# Backup av filer/foldrar.
function mkbakd() { _dir=`echo "${1%/}"'`; ditto -v "${_dir}"{,.bak}; }
function mkbak() { cp -iv "$1"{,.bak}; }
function mvbak() { mv -iv "$1"{,.bak}; }

# Radera rader i historiken
function delHist() { sed -i '' "/$1/d" $HISTFILE; }

# Sök i historiken med grep
function hgrep() { history | grep "$1"; }

# Synka 2 foldrar
function rsyncDir()
{
    # tar bort ev "/" och lägger till en själv
    # så man inte får 2st "//" i slutet
    rsync -avzuc --delete "${1%/}/" "${2%/}/";
}

# Visa i Finder var programmet/skriptet ligger
# Ex: whichR rsync, så öppnas ett fönster
# i Finder med den foldern
function whichR() { open -R `which $1`; }

# Sök och radera (rekusrivt), men "find". $1 = söktermen.
function lsFiles() { find . -name "$1" -type f; }
function rmFiles() { find . -name "$1" -type f -delete; }

# Öppna Terminal-manualer i eget fönster.
# Anv: "manx" istället för "man"
# Ex1: manx grep
# Ex2: manx find rsync mkdir
function manx() { local i; for i; do open x-man-page://$i; done; }

# Övriga
# --------------------
# Sök från Terinalen (byt webläsare om man vill)
function ddg() { open -a Firefox "https://duckduckgo.com/?q=$1"; }

# Öppna/gå till MWF
function mwf() { open -a Firefox "http://forum.macworld.se/"; }

# Detaljerard info om en IP-adress
# Ex1: ipInfo
# Ex2: ipInfo 123.456.78.90
# Ex3: ipInfo dn.se
ipInfo() {
    [[ $1 == '' ]] && _ip=$(dig +short myip.opendns.com @resolver1.opendns.com) || _ip=$1;
    if grep -P "(([1-9]\d{0,2})\.){3}(?2)" 2>/dev/null <<< "$_ip"; then
        curl ipinfo.io/"$_ip"
    else
        ipawk=($(host "$_ip" | awk '/address/ { print $NF }'))
        curl ipinfo.io/${ipawk[1]}
    fi
    echo
}

# Kolla vädret
# Ex: wttr Örebro
function wttr() { curl -4 wttr.in/$1; }

# Debugging
# --------------------

# Funktion som automatiskt visa vilken kod/felmeddelande
# man fick om något blir fel.
# 1 = standardfel, ofta när något avbröts bara
function EC() {
    echo -e "\e[1;31m${FUNCNAME}:\e[1;33m code: $? \e[m\n"
}
trap EC ERR

 



En början i a f. :) Lägg till/ta bort så det passar vad man vill ha. F f a så kan man senare då man känner att man har bättre koll på vad det är och vad de gör , ta bort raderna med # framför (mina kommentarer). Korta ner dem el ta bort de överflödiga, så blir filerna mycket renare och mer lättlästa sen. De är där nu som hjälp för den som vill/behöver. Någon funktion som behöver mer förklaring, så fråga bara.

Länk till kommentar
Dela på andra webbplatser

.bashrc och PS1(..4)

Varje gång du startar Terminal, eller öppnar ett nytt Terminal-fönster, så visas en rad där, och därefter så skriver man sina kommandon. Den informationen lagras i variabeln: PS1. Det finns flera, PS1-4, och nu även i senaste versionen av bash, PS0 - men vi koncentrerar oss bara på PS1 här, för det är den raden som kan visa lite intressant information.

Nu kommer jag inte ihåg exakt hur det ser ut i en standardinstallation av OS X/macOS, men jag tror det är (≈):

sven-allers MacBook: ~#

fast längre + ett osynlig mellanslag.

Ibland an det visas en massa siffror och en hel internetadress där istället (t ex en teliaadress). Då får man fixa till det. Hojta till i tråden så skriver jag hur. Men kort, man får ange/sätta hostname bättre så systemet “förstår”.

Till skillnad från den ovan, så har jag t ex:

[AnvändarnamnMedGrönText@datornsnamn] ~$

I den raden kan man även visa sökvägen till aktuell folder på lite olika sätt, visa saker i olika färger, få med datum och tid osv... Läs mer här: https://www.gnu.org/software/bash/manual/bash.html#Controlling-the-Prompt

T ex så visar \h och \H datorns namn lite olika. Den senare visar hela. Exempel:

# Hostname exempel: test.foo
\h visar test
\H visar test.foo

- - -

Men för att göra en liknande den jag har ovan där. Liknande, för vi skall göra den lite mer standard, där ~ hamnar innan för ]. Det är jag som vill ha den utanför.

Öppna ~/.bashrc:

open -e ~/.bashrc

Efter raden med ~/.bash_exports så lägg till följande:

# Färger
# --------------------
_red='\[\033[0;31m\]' # röd
_grn='\[\033[0;32m\]' # grön
_ylw='\[\033[0;33m\]' # gul
_blu='\[\033[0;34m\]' # blå
_pur='\[\033[0;35m\]' # lila
_cyn='\[\033[0;36m\]' # cyan
_gry='\[\033[0;37m\]' # grå
_bold='\[\033[1m\]'   # fettext
_def='\[\033[0m\]'    # återställning


# Användare@host i PS1
# --------------------
_host='\H'      # \h = fram till första .

# Tmp namn (för att gömma riktiga namnet, t ex för skärmdumpar/filmer)
#_user='test'
#_host='exempel'

# Om man loggar in som root (sudo su), så visa det med rött
[[ $UID == 0 ]] && _user='${_red}\u'
[[ $SUDO_USER ]] && set -e && _user='${_ylw}${_user}'

# PS1
# [namn@host folder]$
PS1="[${_grn}${_user}${_def}@${_host} ${_gry}\W${_def}]\$ "

Spara filen, men stäng inte.

Laddar du om filen nu så skall den nya PS1 visas:

. ~/.bashrc

Det mesta är väl självbeskrivande där, men annars så var det en sektion med färger, där resp färg fick en egen variabel man kan använda sen. Sen ett par rader om \u och \H (\h). Skall man ta en skärmdump så kan man t ex ta bort # framför de 2 raderna där, så visas t ex: [test@exempel ~]$ istället.

- - -

Innan man stänger filen...

Några fler saker som är bra att lägga till. Det är saker som både hjälper och påverkar betéendet i bash.

Den observante ser att det är en hel del “export” med där... Så, varför är inte de med i .bash_exports? Jo... Visst skulle man väl kunna pilla in de där, men det är inga sökvägar utan mer inställningar för Terminalen och ligger därför i huvudfilen/kontrollfilen för de andra. De är mer basic-saker än xtra s a s.

Så, i slutet av filen - lägg till följande:


 

# Övrigt + shopt-inställningar
# ------------------------------------------------------------------------------

# Snåla inte. 
export HISTFILESIZE=50000
export HISTSIZE=50000

# tecken som gör att det inte bygger på i historiken
# Ex: ett kommando man kör med mellanslag lagras inte
export HISTIGNORE='&:[ ]*#'

# ignoreboth = ignoredups + ignorespace
export HISTCONTROL=ignoreboth:erasedups

shopt -s histappend
export PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

# Korrigera namn
shopt -q -s cdspell

# utökad matchning av namn
shopt -q -s extglob

# Notifiera direkt
set -o notify

# Anv inte [CTRL-D] för att logga ut (istf exit)
set -o ignoreeof

# Om bash versionen är >=4
# auto cd = att man kan skriva
# cd **/pdf ...istället för
# cd ~/Dokument/jobbet/möten/pdf
[ ${BASH_VERSINFO[0]} -gt 3 ] && shopt -s globstar autocd

 



Det ger en hyfsat bra grundinställning av bash (Terminalen). :yeahbaby:

Spara, stäng och sen ladda om.

. ~/.bashrc

- - -

 

Xtra

Det finns en fil till, som inte nämnts, men den skapar sig själv automatiskt. Det är: ~/.bash_history.

I den lagras alla kommandon som körs. En del av inställningarna ovan är för att inte den skall bli överfylld snabbt, och längden på den är satt till 50000 (rader).

Det är en vanlig textfil, så för att kolla historiken:

history

# eller med ditt alias
h

# eller öppna den med textredigeraren
open -e ~/.bash_history

OBS! Denna fil är inte bra att “ladda in”.

. ~/.bash_history

...vilket skulle innebära att samtliga kommandon körda innan (lagrade i den filen) körs om igen. Bra att tänka på s a s. :crossfingers:

Råkade göra det av misstag vid ett tillfälle, men fick som tur va stopp på det fort. ^_^

- - -

Där skulle man väl kunna stanna och säga att man har allting förberett/installerat och klart. Bara att köra på nu s a s, men det är en annan sak - hur man använder Terminal och vad man kan göra där.

Men det kommer några inlägg om det med. :crossfingers::yeahbaby:

Om det är något man undrar över, så skriv på bara... Det finns många på forumet som kan svara. :ThumbsUp:

Länk till kommentar
Dela på andra webbplatser

Ok... 3 djupa andtetag nu. Så, då forts del 2 nu.

 

 

Några saker som man (alla) bör kunna

Oavsett hur mycket man spenderar i Terminal eller inte. En del är aldrig där... oftast för att det kanske kan verka lite skräckinjagande och man kanske tror om att man gör fel - att man krashar hela datorn.

Visst, det finns saker man inte bör göra, och andra som är både direkt olämpliga och rent av förödande. Men, det är relativt få saker man kan göra som ställer till så. Och är man osäker, så fråga bara eller sök. Man behöver inte vara speciellt rädd, meen... Man skall ha repekt för vad det kan hitta på om man råkar göra fel. Och som god Mac-användare har man alltid en/flera backup'er.

Men i a f... De flesta saker man gör som blir fel, dvs att man kanske har skrivit/stavat fel, gör helt enkelt att det hela avbryts bara. Att det tar stopp, &/eller kommer ett felmeddelande. Thats it, liksom.

Det man däremot måste vara lite noggrann med är i början av ett kommando, så man inte råkar få med ett mellanslag eller annat.

Exempel:

sudo rm -rf /usr/local/bin/foo

...tar bort filen foo, medans:

sudo rm -rf / usr/local/bin/foo

ja, du ser ju mellanslaget där efter /. Då tar den det som 2 olika argument. / = rootfoldern, och den andra (usr/local...) kommer inte att hittas. usr/local finns inte, men /usr/local gör det.

Andra sammanhang där det kan få stor betydelse är när man skall ändra rättigheter på något och man råkar skriva fel, så fel saker får fel rättigheter.

- - -

Men här är i a f några saker jag tycker att man (alla) bör kunna. Några av de mest grundläggande sakerna och som kan vara till hjälp om man måste in...

Man kan alltid få fram i terminalen vilken folder man står i:

# pwd - print working directory
pwd

Byta till en annan...

# cd - change directory
cd ~/Desktop

# gå tillbaka till föregående
cd -

# Gå till hemfoldern
cd ~/
cd ~
cd

# alla 3 gör samma sak

# gå upp en nivå
cd ..

# I inläggen ovan finns ett alias för det
# så då räcker det med
..

Några saker man kan skriva för att få fram info:

# skriv ut användarnamn
echo $USER
whoami

# skriv ut hostname
hostname

# skriv ut hemfoldern
echo $HOME

# visa inloggade
who
w

- - -

Datum:

date          # Sat Oct 22 09:59:55 CEST 2016
date "+%F"    # 2016-10-22
date "+%X"    # 09:59:55
date "+%F_%X" # 2016-10-22_09:59:55


# xtras, prova kör dessa 3.
# ganska användbara. 
cal
cal 2016
cal 11 2016

- - -

Filer och foldrar

# visa innehållet i nuvarande folder
ls

# visa i en annan
ls ~/Dokument

# som detaljerad lista, inkl rättigheter
ls -Ahl

# i annan folder
ls -Ahl ~/Bilder

# på enskild fil
ls -Ahl ~/Bilder/bilden.png

Skapa nya foldrar...

mkdir ~/Skrivbord/ny_folder

# djupare ner i datorn där det saknas
# foldrar på vägen dit
mkdir -p ~/Skrivbord/på/ny/plats/ny_folder

# flera på en gång
mkdir ~/Skrivbord/folder1 ~/Desktop/folder2 ~/Desktop/folder3

# vilket kan skrivas med
mkdir ~/Skrivbord/{folder1,folder2,folder3}

# ...eller i det här exemplet
mkdir ~/Skrivbord/folder{1..3}
# skapa en ny fil enkelt med
touch ~/Skrivbord/ny_fil.txt

Finns även flera andra enkla sätt att skapa filer.

 

- - -

Kopiera och flytta

# cp (copy) och mv (move)

# cp <från> <till>
# mv <från> <till>

cp ~/Skrivbord/filen.txt /någon/annanstans/filen.txt
mv ~/Skrivbord/filen.txt /någon/annanstans/filen.txt

# är det från en annan folder till den man står i,
# då räcker en punkt och det är samma namn

cp /någon/annanstans/filen.txt .
mv /någon/annanstans/filen.txt .

# är det i samma folder kan man med fördel anv {}
cp ~/Skrivbord/{filen,nyttfilnamn}.txt
mv ~/Skrivbord/{filen,nyttfilnamn}.txt

Ett smidigt exempel är om man skall ta en backup av filen innan man ändrar nåt.

Scenario: Göra en kopia/backup, ändra i originalet. Det ville man sen inte ha och man kan då skriva tillbaka originalet igen.

# Kopiera filen till *.bak (std för backup)
# ...eller anv .orig
cp ~/Skrivbord/filen.txt{,.bak}

# gör ändringar i filen.txt

# om de inte blev bra
mv ~/Skrivbord/filen.txt{.bak,}

- - -

Öppna saker

# open fil|folder|program osv

# Öppna en fil med förvalt program
open ~/Skrivbord/filen.txt

# Öppna filen med annat program
open -a Program ~/Skrivbord/filen.txt

# med mellanslag i programnamnet
open -a "Annat Program" ~/Skrivbord/filen.txt

# Dvs öppna program direkt med -a utan
# sökvägen dit. T ex:
open -a "Wi-Fi Diagnostics"

# - - -

# open -R
# -R = reveal in Finder
# Visar filen i Finder istället för att öppna den
open -R ~/Skrivbord/filen.txt


# open -n
# -n = ny
# Starta t ex flera miniräknare på en gång
open -a Calculator
open -na Calculator
open -na Calculator
# = 3st öppnade

Information om datorn, som kan vara bra när man söker fel och annat:

uname

# visa hela
uname -a

# eller utan visa sitt datornamn/hostname
uname -v

# Software info
sw_vers

# eller de 3 var för sig
sw_vers -productName
sw_vers -productVersion
sw_vers -buildVersion


# Systeminformation (samma som i -menyn)
system_profiler

# eller en mindre/kortare variant av den
system_profiler -detailLevel mini

Man kan med den t ex istället för att det visas i terminalen (är en hel del) skicka det direkt till en textfil.

system_profiler -detailLevel mini > ~/Skrivbord/SysInfo.txt

- - -

Andra lite mer specifika, men som är bra att ha till hands:

# finns som alias: whatsOpen
pmset -g assertions

# finns som alias: whatHW
networksetup -listallhardwareports

Den första är bra när datorn inte vill sova, och man kan kolla vad som orsakar det. Den andra listar alla hårdvara man kopplat till datorn.

- - -

Ändra rättigheter på en fil/folder (ACL).

Ofta om något blir fel, så kan det vara så enkelt att det är fel på rättigheterna på något som gör att filen inte går att öppna eller programmet inte kkan köras. OS X har bra koll på rättigheterna, men ibland kan man behöva fixa det själv, om inte annat för att t ex begränsa dem till sig själv. Och i vissa fall kan det t o m rädda en från att behöva göra en ominstallation.

Så, som ovan, med ls -Ahl, så kan man visa rättigheterna och med chmod, och chown kan man ändra dem, inkl ändra ägare på filen.


Det kan vara bra eftersom OM man använder sig av Finder istället... drar över en fil till ett ställe där man får upp en ruta och man skall skriva sitt lösenord. Ja, man har ju godkänt flytten, och angett adminlösenordet. Men filen på sin nya plats får då dig som ägare stället för root. Oftast inte så bra.

# visa detaljerad lista med rättigheter
ls -Ahl /sökväg/till/filen.txt

# ändra t ex 755 (körbar fil)
# båda gör samma sak
chmod 755 /sökväg/till/filen.txt
chmod +x /sökväg/till/filen.txt

# byta ägare
chown root /sökväg/till/filen.txt

# byta ägare:grupp
chown root:wheel /sökväg/till/filen.txt

# byta till sig själv så kan man använda USER
chown $USER:staff /sökväg/till/filen.txt

För att byta på fler så kan man lägga till -R (rekursivt) så ändras hela folderns innehåll.

# ändrar allt i den foldern (i 1 nivå)
chmod 755 /sökväg/till/folder/*
chmod -R 755 /sökväg/till/folder

# ändra foldern och allt i den
chown -R $USER:staff /sökväg/till/folder

I filen med alias finns det 2 st som har räddat en ett par gånger. För att undvika att filer får samma rättigeheter som foldrar (och tvärtom), så kan man köra dessa, så appliceras det bara på folder resp filer - rekusrsivt från den folder man står i.

# type -d = foldrar
# type -f = filer
find ./ -type d -exec chmod -v 755 {} \;
find ./ -type f -exec chmod -v 644 {} \;'

755 resp 644 är standardrättigheter på de respektive.

- - -

Sen, inget man behöver kunna, men bra att känna till. Att kopiera in saker i delar av datorn som kräver sudo. Man kan använda cp eller mv och sen använda chmod och chown... Men, det finns ett program som är riktigt bra just till det.

install

Inte att förväxla med installer, som hanterar installationsfiler/paket (.pkg). Utan man kan väl se det som en kopieringsfunktion (cp), fast mycket bättre. Fördelen är att man kan ange rättigheter och ägare på en gång. Skapa automatiska backup'er om filen redan finns osv.

Finns många exempel man skulle kunna skriva, men som grund:

# -m = rättighet (acl)
# -v = verbose
# -d = folder
# -o = ägare
# -g = grupp
install -v -d -m755 -o root -g wheel /usr/local/foo

# numeriska värden för root/wheel är 0
# så man kan med fördel använda det här
install -v -d -m755 -o0 -g0 /usr/local/foo

Skapar foldern foo i /usr/local, med rätt ägare/grupp och rättighet. Finns redan foldern visas ingenting, annars (med -v) som skrivs det ut i Terminal sökvägen dit, lite som bekräftelse.

Samma med att kopiera in en fil på rätt plats. T ex när man skall installera ett skript/program som skall vara körbart. Standard för filer är 644, så båda exemplen här gör samma sak:

# 'sudo' används eftersom det inte är vi som
# är ägare till foldern som det skall skrivas till

# Exempel 1:
cd ~/Skrivbord
sudo cp -v skriptnamn /usr/local/bin
sudo chmod +x /usr/local/bin/skriptnamn
sudo chown root:wheel /usr/local/bin/skriptnamn

# Exempel 2: samma med install
cd ~/Skrivbord
sudo install -v -m755 -o0 -g0 skriptnamn /usr/local/bin

- - -

Det finns säkert fler saker man skulle kunna klassa som “grunder”, men som liten start. :crossfingers::yeahbaby:

Länk till kommentar
Dela på andra webbplatser

“Sudo” + Terminalinställningar

sudo är det kommando man anger innan man kör något som kräver admin-rättigheter, annars kommer det upp “Permission denied”, el liknande. Oftast handlar det om när man skall kopiera/flytta över filer till ett område i datorn där man inte “äger” den foldern det skall skrivas till. Som normalanvändare har man inte tillgång till det. Det är bl a därför det är bra att man har ett administratöskonto, och sen ett vanligt användarkonto.

När man kör sudo så får man upp frågan om lösenord. Då man skriver det så syns ingenting i Terminal. Det är en säkerhetsåtgärd eftersom det annars skulle kanske lagras i historiken (history, eller i ~/.bash_history). I exemplen ovanför, i alias-filen, ligger ett alias som heter “fuck” (jaja, jag vet... men byt namn på det då).

alias fuck='sudo $(history -p \!\!)'

Det kan komma till räddning, om man råkat glömma skriva sudo. Det kör om senaste/sista kommandot, fast med sudo innan. Xtra bra om det var nåt långt man behövde skriva. :crossfingers:

Annars är det ganska rätt fram med användningen. Lösenordet lagras 5min (default) så man slipper skriva om det om man skall köra flera kommandon i rad. Är man xtra noga och inte orkar vänta 5min... kör:

sudo -k

...så nollas det. :yeahbaby:

- - -


Inställningar

Till Terminal finns ett antal olika såna “defaults write”. De flesta finns att ställa in direkt i Terminals inställningar (se menyn). Men det är ju alltid smidigt att kunna köra med defaults write - går lite fortare.

Kör dessa, en i taget...

defaults write com.apple.Terminal ApplePersistence -bool false;
defaults write com.apple.Terminal FocusFollowsMouse -bool false;
defaults write com.apple.Terminal NSQuitAlwaysKeepsWindows -bool false;
defaults write com.apple.Terminal SecureKeyboardEntry -bool true;
defaults write com.apple.terminal StringEncodings -array 4;

Den sista där sätter teckenkodningen till UTF8.


Färger/tema i Terminal

Öppna inställningarna så finns ett gäng olika färdiga teman där. Terminal är oftast tråkig vit med svart text som gör att det blir svårtläst och jobbigt för ögonen, och att när det kommer färger med i texten så syns det inte så bra.

Det finns ett tema som heter “Pro”. Det är bra - svart och med transparens osv. Dubbelklicka på det bara så laddas det in. Och markera det som standard/default i inställningarna.

Mitt tema som jag kör med är en variant på Pro-temat, med lite blåare toning och suddig bakgrund.

 

Om ni vill ha det (prova/testa), så ladda ner filen här:

MWF.terminal.zip

Packa upp den och dubbelklicka på den bara (filändelsen .terminal känns av automatiskt), och sen markera den som förvald.

 

post-64246-0-28511500-1477284709_thumb.jpg

Länk till kommentar
Dela på andra webbplatser

Ja, det blev en del i a f... pclaugh.gif Det kommer väl varteftersom lite exempel/miniguider, men så man kan ha tråden lite som “Komma igång i Terminalen”-tråd. Kanske man skall göra ett inlägg sen där man går igenom varje alias/funktion i grundfilerna - vad det gör osv?

Fråga på om det är nåt. Det finns många som kan svara...

 

Nåt speciellt jag missat, som borde varit med? så hojta till, så editerar jag in det.

 

term.png

Länk till kommentar
Dela på andra webbplatser

Det här borde jag ta mig tid till när jag inte har inspiration till att göra annat nu när vintermörkret börjar sänka sig. Bra med en tråd som man kan återvända till när andan faller på. :yeahbaby:

 

Är det bara att kopiera och klistra in de här koderna och se vad som händer när man kör dem?

Tack! Ja, de allra flesta exempel är fullt körbara, sånär på de med namn som: “foo”, “skriptnamn”, “/sökväg/till/...”, “/någon/annanstans...” osv.

Länk till kommentar
Dela på andra webbplatser

 

Inte för honom. Det här kan han i sömnen - det ser man om inte annat på tidpunkten för trådens skapande :whistling::D

 

:hihihi:

Länk till kommentar
Dela på andra webbplatser

Ollie Williams

Hatt av. :ThumbsUp:

Länk till kommentar
Dela på andra webbplatser

Hatten av! Sicket jobb! :)

Hatt av. :ThumbsUp:

Inte för honom. Det här kan han i sömnen - det ser man om inte annat på tidpunkten för trådens skapande :whistling::D

Tack tack... Kul att ni gillade det. :yeahbaby:@eSnobben: Var faktist redan natten innan jag började pilla ihop inläggen från mina skisser innan. Sen igår morse var det mer att lägga in dem, justera/formatera lite och sen flytta dem hit. Det tar en stund längre tid att skriva varje sånt ett inlägg, än en halvtimma.

Länk till kommentar
Dela på andra webbplatser

Köra kommandon och hur man skriver

För er som aldig eller inte kört så mycket i Terminal, så kan det vara knepigt med hur man skall skriva och formatera det man skall skriva. Så en liten snabbgenomgång av det...

# som oftast...
kommando/program <olika> <input> <här>

Man kan börja med det kanske som är viktigast... Hur man fomaterar textsträngar. Det kan vara både ren text eller en sökväg till en fil. Eftersom ett program kan ta olika parametrar/variabler/argument så känner den av det med olika mellanslag mellan varje, så en felformaterad text kan då misstolkas som flera olika input. Det som händer oftast då är att man får ett meddelande om att filen/foldern inte fanns.

Exempel:

cd ~/Library
cd ~/Library/Application Support

Den första går bra, men inte den andra. Den kommer att söka efter foldern:

~/Library/Application

Då får man tala om för Terminal att det är ett mellanslag med \ (escape character), som gör att mellanslaget blir ett mellanslag.

cd ~/Library/Application\ Support

Det är så det formateras om du skriver cd, gör ett mellanslag och sen drar in foldern i Terminalfönstret och släpper den där (ett exempel ofta beskrivet i olika trådar på forumet).

Alternativt kan du stoppa texten inom citattecken - 'enkla' eller "dubbla".

cd "~/Library/Application Support"
cd '~/Library/Application Support'

Skillnaden medllan enkla och dubbla citattecken är att om man har med en variabel, så körs inte den med enkla citattecken.

# funkar
$ echo "$HOME/Library"
/Users/Sven-Allers/Library

# funkar inte
$ echo '$HOME/Library'
$HOME/Library

Du kan också börja skriva manuellt och efter en / och ett par bokstäver - tryck på [tab] så fylls det i automatiskt.

 

post-64246-0-35907800-1477453178.gif

 

- - -


I exemplet ovan med att dra in en folder eller fil i Terminalfönstret. OS X har väldigt bra drag'n'drop-support, så det går bra. Man kan även markera fler filer och dra in på en gång.

Ett bra tips... I inlägget ovan med inställningarna i .bashrc. Det finns en rad där med autocd (ligger i spoilern), som man kan använda om man har version >= 4 av bash. Nu vet jag inte vilken version som finns i OS X idag eftersom jag har en egen installerad version (4.4.0).

Ni kan kolla vad ni har med:

bash --version

Inställningen i .bashrc är den längs ner och ser ut såhär:

[ ${BASH_VERSINFO[0]} -gt 3 ] && shopt -s globstar autocd

Med autocd behöver man inte skriva cd, utan det räcker att man bara drar in foldern och trycker “enter”. I Terminalen ser det ut såhär:

[test@fooBar] ~$ ~/Library/Application\ Support/
cd -- '/Users/test/Library/Application Support/'
[test@fooBar] Application Support$

Väldigt smidgt och användarvänligt. :yeahbaby:

- - -

En del program behöver olika “options”. T ex

mkdir -pv ~/Skrivbord/Ny\ folder

# eller
sips -Z 500 bilden.jpg

Ibland tillför de en egenskap, ibland behöver de ett värde. Manualerna i Terminal är alltid bra att referera. Där står alltid de olika sätten beskrivna.

man mkdir

# Eller med funktionen i tidigare inlägg.
manx mkdir

Manualer kan kännas lite knepiga i början att läsa. Inte alltid helt lätta och logiska att förstå, men man kommer rel fort in i det. Och får man grepp på ett par tre stycken så känns det lättare sen.

 

Är det någon manual som verkar helt pucko, så skriv en fråga så är det säkert någon som kan svara på den. :crossfingers:

Länk till kommentar
Dela på andra webbplatser

  • 9 months later...

Grymt bra guide till terminalen. Hoppas den hjälper många så att fler vågar använda detta underbara verktyg

Länk till kommentar
Dela på andra webbplatser

Grymt bra guide till terminalen. Hoppas den hjälper många så att fler vågar använda detta underbara verktyg

Tack! Ja, det var själva grundidén med den. :ThumbsUp:

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.



×
×
  • Skapa nytt...