"cat" anstelle von "ls"

Hallo Community,

folgendes habe ich versucht:

ich habe in /tmp eine Datei erstellt und diese „ls“ genannt. Der Inhalt der Datei ist „/bin/cat“.
Jetzt habe ich den Pfad /tmp in die PATH-Variable eingefügt.
Ich habe nun erwartet, dass wenn ich nun den Befehl „ls“ absetze, in Verbindung mit einem Dateinamen, mir diese Datei ausgegeben wird, so als hätte ich „cat Dateiname“ geschrieben.
Allerdings verhält es sich anders als erwartet. Der Cursor springt in die nächste Zeile und bleibt dort stehen, bis ich mit „Strg+C“ abbreche.
Worin liegt der Fehler? Hat vielleicht jemand eine Idee?

Vielen Dank im Voraus

Hallo,
du hast vielleicht das x Bit vergessen? chmod a+x /tmp/ls und dann muesste es funktionieren, wie Du es erwartest.

Danke für die schnelle Antwort,
Ich hatte die Berechtigung auf 777 gesetzt, somit sollte das von den Berechtigungen auf jeden Fall funktionieren.

Dann ist der Pfad /bin noch vor /tmp in PATH?

export PATH=/tmp:$PATH
rehash
ls XXX

muesste klappen. Oh, und aufpassen, ls ist (manchmal) ein shell built-in, oder ein alias mit weiteren Optionen. In der zsh klappt es aber so wie oben angegeben.

Dann müsste in deiner /tmp/ls das folgende stehen


#!/bin/sh
cat $*

leider liegt es auch nicht daran. Ich habe schon mehrere Variationen in PATH-Variable versucht. Ich habe auch einmal nur diesen Pfad probiert. Ohne Erfolg.
Es verhält sich so als würde man dem „cat“ Befehlt keine Datei übergeben.
Ich versteh das einfach nicht. Hast du noch eine Idee?

Vielen Dank! Das funktioniert!

Ja, das ist der fehlende Teil. Du hattest cat aufgerufen, ohne die Parameter (den Dateinamen zu übergeben).
Daher wartet cat ewig auf Input und du musstest es mit Strg-C abbrechen.

Gruß,
Steve

1 Like

Hallo!

Du darfst dir das nicht so vorstellen, daß hier eine Ersetzung vorgenommen wird, und aus

ls Dateiname

ein

cat Dateiname

wird. Viel mehr wird hier nur der Befehl cat ausgeführt, und wenn der keine weiteren Parameter bekommt, dann dann wartet der halt für alle Ewigkeiten.

Das Script bekommt den Parameter Dateiname übergeben, und steht dann in der Variablen $1 zur Verfügung. (Und ja, ein weiterer Parameter wäre dann $2

Das Script sollte daher so aussehen:

/bin/cat $1

Denn überleg mal, ein Script kann aus hunderten von Zeilen bestehen, in denen dein(e) Parameter an ein oder mehreren Stellen mittendrin benutzt werden. Wie sollte das so einfach funktionieren?

Nebenbei ist es nicht gut, einfach nur diese eine Zeile in eine Datei zu schreiben. besser wäre es z.B. so:

#!/bin/bash
cat $1

Die erste Zeile gibt an, daß dies eine Bash-Datei ist, und eben mit /bin/bash geöffnet werden soll. (Das ist anders als Windows, wo die Dateiendung dafür genutzt wird)
Und eigentlich brauchst du für den cat-Befehl nicht den Pfad angeben.

Ah, jetzt habe ich begriffen, was Du gemacht hast, ich habe einfach ein cp /bin/cat /tmp/ls gemacht, also physisch das binary cat nach /tmp/ls gelegt.

Besser als die bisher akzeptierte Variante ist dann allerdings:

/bin/cat "$@"

Damit auch mehr als 1 Argument and cat übergeben wird.

Okay. Vielen Dank für die antworten jetzt ist mir einiges klarer.
Aber mal angenommen ich wollte das jetzt nicht mehr nur für „ls“ sondern zum Beispiel auch für „ls -la“ machen. Das wenn ich „ls -la“ eingebe der „cat“ Befehl ausgeführt wird. Wenn ich so vorgehe wie im 1. Fall, müsste ich die Anführungszeichen mit angeben damit es funktioniert. Wie schaffe das ohne Anführungszeichen?

Wäre nett wenn da auch noch jemand helfen kann.

Hallo!

Wenn du nur ls -la eingibst, welche Datei soll denn dann angezeigt werden?
Das müßte ja eher sowas wie ls -la Datei sein.

Das folgende Script funktioniert sowohl mit ls Datei als auch mit ls -la Datei, wird aber z.B. an ls -lha Datei scheitern.

if [  "$1" == "-la"  ] ;then
    cat $2
else
    cat $1
fi

Ahh ich verstehe, wenn das erste Argument „-la“ lautet wird der „cat“ Befehl mit dem 2. Argument ausgeführt. Wenn das 1. Argument nicht „-la“ lautet wird der „cat“ Befehl mit diesem ersten Argument ausgeführt. So langsam ergibt das alles einen Sinn.

Ich danke dir!