スクリプト自体からスクリプトを実行可能にする

スクリプト自体からスクリプトを実行可能にする

予約ブロックの割合を表示するスクリプトが欲しいです。別の方法で実行できるのであれば、それは良いことです。

手動で実行可能にすると機能します。スクリプト自体から実行可能にすることはできますか?

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

答え1

あなたの質問への回答

もちろんそれは可能ですが、良いやり方だとは思いません。より良い解決策については以下を参照してください。

シェルを実行し、スクリプト ファイルを引数として渡すと、シェバンや実行ビットの有無に関係なくスクリプトが実行されます。

$ 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

chmodスクリプトが複数回実行される場合、毎回必要もなく呼び出すことはおそらく望ましくないので、ファイルが実行可能でないかどうかをテストするだけです。

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

スクリプトに関しては、awk1 回の呼び出しですべてを実行できます。

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

私はsudoあなたがスクリプトでは使用しないでください– 代わりにスクリプト全体を root として実行します。

あなたの問題の解決策

質問から、スクリプトを設定するために必要な 2 つの手順に困っていることがわかりました。それに役立つスクリプトを作成しましょう。

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

cat <&0 >"$1"catstdin から読み取り、最初の引数として指定したスクリプト ファイルに書き込みます。これを eg として保存しmakescript、 で実行可能にしますchmod +x /path/to/makescript。スクリプトを書きたい場合は、次のように記述するだけです。

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

/path/to/makescript毎回入力したくない場合は、makescript=/path/to/makescriptまたはのようなエイリアスを定義する~/.bash_aliases~/.bashrc、 内のディレクトリに移動しますPATH

実行例

$ 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

可能性は無限大です。

答え2

スクリプトの内容を記述して、同じコマンドで実行可能にしたい場合は、 のchmod後にを追加するだけです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

また、スクリプトを少し簡略化してみました。すでに を使用しているawkので、すべてをそこで実行してもかまいません。

答え3

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

関連情報