Gibt es eine Möglichkeit, ein Skript zu erstellen und es in weniger Code ausführbar zu machen?

8

Mein Code zum Erstellen eines ausführbaren Skripts

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh
Schein Fiorin
quelle
2
@ShamFiorin Ich wollte den ersten Teil der Antwort auf Desserts hervorheben. Sie sollten versuchen, sudosehr sparsam zu verwenden. Es kann gefährlich sein, sich daran zu gewöhnen, es herumzuwerfen. In diesem Fall besitzen Sie das von Ihnen erstellte Skript, sodass Sie mit den Berechtigungen nach Belieben arbeiten können, ohne dass ein Sudo erforderlich ist.
Marie
2
Allgemein verwandt: Tipps zum Golfen in Bash
Digital Trauma

Antworten:

18

Sie können den gesamten touchBefehl weglassen und müssen ihn nicht verwenden sudo. Um die Befehlszeile verkürzt weitere können Sie mit bashGeschichte Erweiterung dem Dateinamen das zweite Mal speichern, und lassen Sie unnötigen Leerzeichen:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3

Die Verlaufserweiterung wird !#:3durch das vierte Wort in der aktuellen Befehlszeile ersetzt, in Ihrem Fall als Dateiname script.sh. Dies muss natürlich angepasst werden, wenn Sie den ersten Befehl ändern, z.

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1

Beachten Sie, dass ein gültiges Skript einen Shebang benötigt :

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1

Wenn Sie diese Befehlskette häufiger benötigen, empfehle ich , eine Funktion zu definieren . Auf diese Weise müssen Sie nur den Funktionsnamen eingeben . Ein ähnlich anpassungsfähiger - wenn auch längerer - Weg ist die Verwendung einer Variablen, die den Dateinamen enthält:

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f

Wenn Ihr Dateiname Sonderzeichen enthält, vergessen Sie nicht, diese richtig zu zitieren .

Dessert
quelle
20

Der installBefehl (Teil des GNU coreutils zusammen mit cp, mv, rm, etc.) , eine Datei kopieren , während auch das Eigentum und das Festlegen von Berechtigungen und die Schaffung von übergeordneten Verzeichnissen wie nötig. Standardmäßig wird die neue Datei ausführbar. Es versteht ' -' nicht, /dev/stdinkann aber stattdessen verwendet werden:

install /dev/stdin script.sh <<< "echo Hello World"

In der obigen Beschreibung wird eine ' here-Zeichenfolge ' verwendet, um den Text auf stdin bereitzustellen, der etwas kürzer ist als das Einleiten. Die Argumente, echodie nicht in Anführungszeichen gesetzt werden müssen, es sei denn, sie enthalten Zeichen mit besonderer Bedeutung.

Deltab
quelle
Beachten Sie, dass Herestring ein Baschismus ist - ein Heredoc wäre tragbar
Steven Penny
3
Gute Idee. Sie können auch eine Prozessersetzung verwenden :install <(echo echo Hello World) script.sh
Digital Trauma
8

Ich bevorzuge es catfür Aufgaben wie diese zu verwenden:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D
Steeldriver
quelle
1

Sie können auch das gesamte chmod weglassen und stattdessen umask vor dem Echo verwenden. Sollte Ihnen ein paar Bytes ersparen. Shebang ist optional, solange Sie Befehle verwenden, die von jeder Shell verstanden werden (hauptsächlich Bourne und C).

GrumpyGuru
quelle
5
Wie würden Sie das genau machen?
Wjandrea
Es ist nicht möglich, umaskstandardmäßig ein ausführbares Bit zu setzen ...
Ravexina