스크립트 자체 내에서 스크립트를 실행 가능하게 만듭니다.

스크립트 자체 내에서 스크립트를 실행 가능하게 만듭니다.

예약된 블록의 비율을 표시하는 스크립트를 원합니다. 다른 방법으로 할 수 있다면 좋습니다.

수동으로 실행 가능하게 만들면 작동합니다. 스크립트 자체 내에서 실행 가능하게 만들 수 있나요?

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

귀하의 질문에 대한 답변

물론 가능합니다. 하지만 저는 그것이 좋은 스타일이라고 생각하지 않습니다. 더 나은 솔루션은 아래를 참조하세요.

쉘을 실행하고 스크립트 파일을 인수로 제공하면 shebang이나 실행 비트가 없어도 쉘이 실행됩니다.

$ 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"stdin에서 읽고 cat첫 번째 인수로 제공한 스크립트 파일에 씁니다. 이것을 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~/.bashrcPATH

예시 실행

$ 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

관련 정보