staging.inyokaproject.org

Alias als Shellbefehl

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Shor-ty

Anmeldungsdatum:
10. September 2010

Beiträge: 719

Hallo zusammen,

kurz und prägnant meine Problemstellung. Ich muss des öfteren Daten bearbeiten. Dabei muss ich stets die erste Zeile dieser Datei durch einen den Ausdruck "solid DATEINAME" ersetzen. Das klappt soweit auch sehr schön ohne Probleme, nur habe ich bislang hierfür ein Shell-Skript verwendet. Der Inhalt ist nachfolgend gegeben (also sehr einfach):

1
2
3
4
5
for i in $(ls .); do

	sed -e 1c"solid ${i%.*}" $i -i

done

Da ich das Shellskript aber immer in diese Ordner kopieren muss und schon mal verschwunden ist (was auch kein Problem ist), dachte ich mir, dass das ggf. mittels einer Alias besser zu händeln ist. Also quasi sowas in der Art in die bash_aliases:

1
2
3
4
5
alias buildRegionSTL="for i in $(ls .); do

	sed -e 1c"solid ${i%.*}" $i -i

done"

Das das oben so aber nicht geht ist mir bewusst. Leider bin ich kein so bewandeter bash-Skripter, sodass ich nun euch Frage was hierfür gut wär? Möglicherweise wäre es sinnvoll meine Skriptdatei irgendwo zu speichern und eine Alias auf diese zu tätigen ☺

Aber vielleicht gehts ja auch in irgendeiner Art wie ich es gern hätte.

Grüße Tobi

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Du kannst dein Shell-Skript einfach in einen Ordner kopieren, der in der Umgebungsvariablen $PATH enthalten ist oder den Ordner, in dem das Skript liegt, zu $PATH hinzufügen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Für längere Codeabschnitte, insbesondere wenn sie Anführungszeichen enthalten müssen, ist einfe Funktion deutlich besser geeignet.

Zwingend wird diese aber erst, wenn Du Parameter übergeben willst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
alias buildRegionSTL="for i in $(ls .); do
	sed -e 1c"solid ${i%.*}" $i -i
done"

function buildRegionSTL() {
    for i in .
    do
        sed -e 1c"solid ${i%.*}" $i -i
    done
}

Statt den Output von ls zu parsen, was bei Whitespace in Dateinamen schnell zu unerwünschten Fehlern fühlt, empfiehlt sich gleich mit dem . als Verzeichnisbezeichner zu arbeiten, wie gezeigt.

Shor-ty

(Themenstarter)

Anmeldungsdatum:
10. September 2010

Beiträge: 719

Hallo,

super für die Antworten danke.

Wo wäre die Funktion am besten aufgehoben? .bashrc ?

Die Funktion müsste ich dann in meinem Skript aufrufen oder gebe es hier dann einen anderen Weg?

Grüße Tobi

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Shor-ty schrieb:

1
for i in $(ls .); do
  1. Sowas ist ein absolutes no-go und sollte NIEMALS, NIEMALS vorkommen ! → nimm eine einfache File Expansion, und alles wird gut:

    for i in  *  ; do
    
    	sed -i "1csolid ${i%.*}" "$i"
    done

    (Du solltest übrigens unbedingt immer korrekt "quoten" - sonst erlebst Du Dein blaues Wunder bei Leer- oder Sonderzeichen !) 😬
    -

  2. Um einen ganzen Verzeichnisbaum zu bearbeiten, nimmt man sinnvollerweise find oder man setzt einfach globstar,
    dann expandiert nämlich der ** in den ganzen Verzichnisbaum:

    shopt -s globstar
    for i in ** ; do
    	if [ -f "$i" ]; then				# bearbeite nur Dateien, keine Verzeichnisse
    
    		f="${i##*/}"				# isoliere den Dateinamen
    		sed -i "1csolid ${f%.*}" "$i"
    	fi
    done

😀 (p.s.: for i in ... kann man auch eine ganze Liste an Verzeichnissen mitgeben !)

LG,

track

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Shor-ty schrieb:

Hallo,

super für die Antworten danke.

Wo wäre die Funktion am besten aufgehoben? .bashrc ?

Da wäre sie gut aufgehoben. Aber am besten? ☺

Die Funktion müsste ich dann in meinem Skript aufrufen oder gebe es hier dann einen anderen Weg?

Wenn das Skript die Funktionen aus der .bashrc kennt. Das müsstest Du ausprobieren, fürchte ich.

Track hat natürlich Recht, dass das $i dann auch gequotet werden soll:

1
2
3
4
5
6
function buildRegionSTL() {
    for i in *
    do
        sed -ie 1c"solid ${i%.*}" "$i"
    done
}

For i in . funktioniert auch nicht; auch da hat er Recht, allerdings nicht mit seiner Rigorosität. Oft überblickt man ja Dateinamen eines Verzeichnisses und kann Whitespaces in Dateinamen ausschließen.

Antworten |