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 chmod
jedes 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, awk
kann 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, sudo
weil 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 cat
von stdin und schreibt in die Skriptdatei, die Sie als erstes Argument angeben. Speichern Sie dies als eg makescript
und 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/makescript
jedes Mal etwas eingeben möchten, definieren Sie einen Alias wie makescript=/path/to/makescript
in Ihrem ~/.bash_aliases
oder ~/.bashrc
oder 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 chmod
nach 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