Сделайте исполняемый файл сценария из самого сценария

Я хотел бы сценарий, который покажет мне процент зарезервированных блоков. Если это может сделанный иначе, который хорош.

Это работает, если я вручную делаю это исполняемым файлом. Я могу сделать это исполняемым файлом из самого сценария?

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
0
задан 13 June 2018 в 00:02

3 ответа

Если вы хотите написать содержимое сценария и сделать его исполняемым с помощью той же команды (sorta), вы можете просто добавить 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, так что вы можете сделать все это там.

1
ответ дан 13 June 2018 в 00:02
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
-2
ответ дан 13 June 2018 в 00:02

Ответьте на свой вопрос

Конечно, это возможно – но я не считал бы это хорошим стилем. Посмотрите ниже для лучшего решения.

Если Вы выполните оболочку и дадите ей файл сценария как аргумент, то она выполнит его независимо от отсутствия хижины, или любое выполнение укусило:

$ 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

Что касается Вашего сценария, awk может сделать все это в единственном вызове:

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

Я удалил sudo потому что Вы не используете его в сценарии – запускает целый скрипт как корень вместо этого.

Решение Вашей проблемы

Я читал из Вашего вопроса, что Вы побеспокоены двумя шагами, необходимыми для установки сценария. Давайте запишем сценарий, который помогает с этим:

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

cat <&0 >"$1" делает cat читайте из stdin и запишите в файл сценария, который Вы даете ему как первый аргумент. Сохраните это как, например. 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

Небо является пределом.

5
ответ дан 29 October 2019 в 03:16

Другие вопросы по тегам:

Похожие вопросы: