这可能是一个愚蠢的问题,但我仍然问它。如果我已经宣布了一个shebang
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
在开始时my_shell_script.sh,我是否总是必须使用 bash 调用此脚本
[my@comp]$bash my_shell_script.sh
Run Code Online (Sandbox Code Playgroud)
或者我可以使用例如
[my@comp]$sh my_shell_script.sh
Run Code Online (Sandbox Code Playgroud)
我的脚本使用shebang确定正在运行的shell?难道同样的事情发生与ksh壳呢?我正在使用 AIX。
所以,我以为我对此有一个很好的理解,但只是进行了一个测试(以回应我不同意某人的对话)并发现我的理解有缺陷......
尽可能详细地说明当我在 shell 中执行文件时到底发生了什么?我的意思是,如果我输入:./somefile some arguments进入我的 shell 并按回车键(并且somefile存在于 cwd 中,并且我有读取+执行权限somefile),那么引擎盖下会发生什么?
我以为答案是:
exec,将路径传递给somefilesomefile并查看文件的幻数,以确定它是否是处理器可以处理的格式somefile被读取/映射到内存。创建堆栈并执行跳转到代码的入口点somefile,并ARGV初始化为参数数组 (a char**, ["some","arguments"])exec()如上所述生成一个新进程,但使用的可执行文件是shebang(例如/bin/bash或/bin/perl)引用的解释器并somefile传递给STDIN但是有人告诉我,如果文件是纯文本,那么 shell 会尝试执行命令(就像我输入了bash somefile)。我不相信这一点,但我只是尝试了一下,结果是正确的。所以我显然对这里实际发生的事情有一些误解,并想了解机制。
当我在我的 shell 中执行一个文件时到底发生了什么?(尽可能多的细节是合理的......)
所以我有一个简单的shell脚本。这两个命令在执行中有什么区别?有没有首选的方法?
$sh -x foobar.sh
或者
$ ./foobar.sh
我发现脚本与第二个命令一起使用时执行速度较慢。
第一行的#!/bin/bash 是什么意思?它是否只是一个注释并像程序中的所有其他注释一样被 shell 忽略
或者
解释器只解释这一行,而从 # 开始的所有其他行都被忽略,除了 #!/bin/bash。
来自https://unix.stackexchange.com/a/276611/674:
当 bash 使用 -c 运行时,它被认为是一个非交互式 shell,它不会读取 ~/.bashrc,除非指定了 -i。
非交互式 shell 是如何定义的?
非交互式 shell 是否定义为不能接受来自 stdin 的输入的 shell?例如bash -c cat可以接受来自标准输入的输入。
非交互式 shell 可以输出到标准输出吗?例如,bash -c date可以写入标准输出。
是否bash -c(没有附加-i选项)总是创建一个非交互式 shell?
来自https://unix.stackexchange.com/a/276611/674
当
bash与 一起运行时-c,它被认为是一个非交互式 shell~/.bashrc,除非-i指定,否则它不会读取。所以,Run Code Online (Sandbox Code Playgroud)$ type cp cp is aliased to ‘cp -i’ # Defined in ~/.bashrc $ cp .file1 file2 cp: overwrite ‘file2’? n $ bash -c "cp .file1 file2" # Existing file is overwritten without confirmation! $ bash -c -i "cp .file1 file2" cp: overwrite ‘file2’? n
shell 是由bash -i -c <command>交互式还是非交互式创建的?
这样的 shell 不接受来自 stdin 的命令,是吗?所以它不是交互式的,是吗?
这样的 shell 读取~/.bashrc,所以它不能是非交互式的,对吗?