Machen Sie das Skript direkt aus dem Skript ausführbar

Machen Sie das Skript direkt aus dem Skript ausführbar

Ich hätte gern ein Skript, das mir den Prozentsatz der reservierten Blöcke anzeigt. Wenn es anders geht, ist das gut.

Das funktioniert, wenn ich es manuell ausführbar mache. Kann ich es aus dem Skript selbst ausführbar machen?

cat > somescript.sh << \EOF
#!/bin/bash

block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Block count:/ {print $NF}')
reserved_block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Reserved block count:/ {print $NF}')

perl -e 'printf("%.1lf%%\n", ($ARGV[0] * 100.0 ) / $ARGV[1])' "$reserved_block_count" "$block_count"
EOF

Antwort1

Antwort auf Ihre Frage

Natürlich ist das möglich – aber ich würde es nicht als guten Stil bezeichnen. Unten finden Sie eine bessere Lösung.

Wenn Sie eine Shell ausführen und ihr die Skriptdatei als Argument übergeben, wird sie ausgeführt, unabhängig davon, ob ein Shebang oder ein Ausführungsbit fehlt:

$ cat no_script
chmod +x /path/to/no_script
$ ls -l no_script
-rw-rw-r-- 1 dessert dessert 24 Jun 12 22:59 script
$ bash no_script
$ ls -l no_script
-rwxrwxr-x 1 dessert dessert 24 Jun 12 22:59 script

Wenn das Skript mehrere Male ausgeführt wird, möchten Sie es wahrscheinlich nicht chmodjedes Mal unnötig aufrufen. Testen Sie daher einfach, ob die Datei nicht ausführbar ist:

[ ! -x /path/to/script ] && chmod +x /path/to/script

Was Ihr Skript betrifft, awkkann es die ganze Sache in einem einzigen Aufruf erledigen:

#!/bin/bash
tune2fs -l /dev/sda1 | awk '/^Block count:/{a=$NF}/^Reserved block count:/{b=$NF}END{printf "%.1f%%\n", b/a*100}'

Ich habe das entfernt, sudoweil duVerwenden Sie es nicht in einem Skript– führen Sie stattdessen das gesamte Skript als Root aus.

Lösung für Ihr Problem

Ich lese aus Ihrer Frage, dass Sie die zwei Schritte stören, die zum Einrichten eines Skripts notwendig sind. Schreiben wir ein Skript, das dabei hilft:

#!/bin/bash
cat <&0 >"$1" &&
chmod +x "$1"

cat <&0 >"$1"liest catvon stdin und schreibt in die Skriptdatei, die Sie als erstes Argument angeben. Speichern Sie dies als eg makescriptund machen Sie es mit ausführbar chmod +x /path/to/makescript. Wenn Sie nun ein Skript schreiben möchten, gehen Sie einfach so vor:

/path/to/makescript /path/to/new/script <<EOF … EOF

Wenn Sie nicht /path/to/makescriptjedes Mal etwas eingeben möchten, definieren Sie einen Alias ​​wie makescript=/path/to/makescriptin Ihrem ~/.bash_aliasesoder ~/.bashrcoder verschieben Sie ihn in ein Verzeichnis in Ihrem PATH.

Beispielausführung

$ echo -e '#!/bin/bash\ncat <&0 >"$1" &&\nchmod +x "$1"' >makescript
$ chmod +x makescript 
$ ./makescript a_test_script <<EOF
> #!/bin/bash
> echo a script
> EOF
$ ls -l *script
-rwxrwxr-x 1 dessert dessert 26 Jun 13 12:44 a_test_script
-rwxrwxr-x 1 dessert dessert 43 Jun 13 12:44 makescript
$ ./a_test_script 
a script

Der Himmel ist die Grenze.

Antwort2

Wenn Sie den Inhalt des Skripts schreiben und es im selben Befehl (sozusagen) ausführbar machen möchten, können Sie einfach chmodnach dem Folgendes hinzufügen cat:

$ cat > somescript.sh << \EOF && chmod a+x somescript.sh && sudo ./somescript.sh
#!/bin/bash
# Show percentage of reserved blocks
#
tune2fs -l /dev/sda5 |
     awk '/^Block count:/{bc=$NF}
          /^Reserved block count:/{rbc=$NF}
          END{printf "%.1f%%\n", (rbc*100)/bc}'
EOF

Ich habe mir außerdem die Freiheit genommen, Ihr Skript ein wenig zu vereinfachen. Sie verwenden bereits awk, also können Sie das Ganze auch dort erledigen.

Antwort3

cat > somescript.sh << \EOF
#!/bin/bash
# Show percentage of reserved blocks

block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Block count:/ {print $NF}')
reserved_block_count=$(sudo tune2fs -l /dev/sda1 | awk '/^Reserved block count:/ {print $NF}')

perl -e 'printf("%.1lf%%\n", ($ARGV[0] * 100.0 ) / $ARGV[1])' "$reserved_block_count" "$block_count"
EOF

chmod +x somescript.sh

somescript.sh

verwandte Informationen