回答編集履歴

3

シェバンの動作(誰が処理をしているのか)について検証したものを追記した。

2020/12/03 12:08

投稿

hidezzz
hidezzz

スコア1248

test CHANGED
@@ -3,3 +3,123 @@
3
3
 
4
4
 
5
5
  2.シェル「sh」が、指定された引数「test.sh」をそのsh自身のスクリプトとして実行するという処理をします。この場合シェバンの仕組みを使いません。
6
+
7
+
8
+
9
+ #※追記
10
+
11
+ 1の件、自分の理解があいまいだったので検証してみました。(環境: Linux Mint 19.3)
12
+
13
+ 結果を先に書くと、
14
+
15
+
16
+
17
+ - execve()システムコールが、シェバンの処理を行う。シェバンが無い場合execve()システムコールはエラーとなる。
18
+
19
+ - 対話シェルを使って実行した場合は、上記エラーの場合にシェルスクリプトとして実行するような処理を行うことによってエラーにならずに実行するようになっている。
20
+
21
+
22
+
23
+ ということのようです。
24
+
25
+
26
+
27
+
28
+
29
+ ```
30
+
31
+ $ls -lA
32
+
33
+ 合計 16
34
+
35
+ -rw-rw-r-- 1 hidezzz hidezzz 273 12月 3 20:31 main.c
36
+
37
+ -rwxr-xr-x 1 hidezzz hidezzz 11 12月 3 20:31 no-shbang.sh
38
+
39
+ -rwxr-xr-x 1 hidezzz hidezzz 20 12月 3 20:20 shbang.sh
40
+
41
+
42
+
43
+ $ cat main.c
44
+
45
+ #include <stdio.h>
46
+
47
+ #include <stdlib.h>
48
+
49
+ #include <unistd.h>
50
+
51
+ #include <errno.h>
52
+
53
+
54
+
55
+ int main( void ) {
56
+
57
+ char* cmdline[ 2 ];
58
+
59
+ int r;
60
+
61
+
62
+
63
+ cmdline[ 0 ] = "test.sh";
64
+
65
+ cmdline[ 1 ] = NULL;
66
+
67
+ r = execve( "test.sh", cmdline, NULL );
68
+
69
+ if ( r < 0 ) {
70
+
71
+ perror( "execve" );
72
+
73
+ }
74
+
75
+
76
+
77
+ return 0;
78
+
79
+ }
80
+
81
+ $ make main
82
+
83
+ cc main.c -o main
84
+
85
+ ```
86
+
87
+
88
+
89
+ シェバンがある場合
90
+
91
+ ```
92
+
93
+ $ cat shbang.sh
94
+
95
+ #!/bin/sh
96
+
97
+ echo test
98
+
99
+ $ cp -p shbang.sh test.sh
100
+
101
+ $ ./main
102
+
103
+ test
104
+
105
+ ```
106
+
107
+
108
+
109
+ シェバンが省略された場合
110
+
111
+ ```
112
+
113
+ $ cat no-shbang.sh
114
+
115
+
116
+
117
+ echo test
118
+
119
+ $cp -p no-shbang.sh test.sh
120
+
121
+ $ ./main
122
+
123
+ execve: Exec format error
124
+
125
+ ```

2

表現修正。

2020/12/03 12:08

投稿

hidezzz
hidezzz

スコア1248

test CHANGED
@@ -1,4 +1,4 @@
1
- 1.シェバン省略ると(ファイルの先頭の2文字が「#!」以外だと)「/bin/sh」を実行するというロジックになっていた気がします。
1
+ 1.シェバン省略されると(ファイルの先頭の2文字が「#!」以外だと)「/bin/sh」を実行するというロジックになっていた気がします。
2
2
 
3
3
 
4
4
 

1

誤字修正。

2020/12/03 10:47

投稿

hidezzz
hidezzz

スコア1248

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- 2.シェル「sh」が、指定された引数「test.sh」をそのsh自身のスクリプトとして実行するという処理をします。この場合シェバンの仕組みを使いません。
5
+ 2.シェル「sh」が、指定された引数「test.sh」をそのsh自身のスクリプトとして実行するという処理をします。この場合シェバンの仕組みを使いません。