相关疑难解决方法(0)

shebang 是否确定运行脚本的 shell?

这可能是一个愚蠢的问题,但我仍然问它。如果我已经宣布了一个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。

scripting executable shebang

110
推荐指数
4
解决办法
8万
查看次数

当我在我的 shell 中执行一个文件时到底发生了什么?

所以,我以为我对此有一个很好的理解,但只是进行了一个测试(以回应我不同意某人的对话)并发现我的理解有缺陷......

尽可能详细地说明当我在 shell 中执行文件时到底发生了什么?我的意思是,如果我输入:./somefile some arguments进入我的 shell 并按回车键(并且somefile存在于 cwd 中,并且我有读取+执行权限somefile),那么引擎盖下会发生什么?

以为答案是:

  1. 外壳程序对 进行系统调用exec,将路径传递给somefile
  2. 内核检查somefile并查看文件的幻数,以确定它是否是处理器可以处理的格式
  3. 如果幻数表明文件是处理器可以执行的格式,那么
    1. 创建一个新进程(在进程表中有一个条目)
    2. somefile被读取/映射到内存。创建堆栈并执行跳转到代码的入口点somefile,并ARGV初始化为参数数组 (a char**, ["some","arguments"])
  4. 如果幻数是shebang,exec()如上所述生成一个新进程,但使用的可执行文件是shebang(例如/bin/bash/bin/perl)引用的解释器并somefile传递给STDIN
  5. 如果文件没有有效的幻数,则会出现“无效文件(错误的幻数):Exec 格式错误”之类的错误

但是有人告诉我,如果文件是纯文本,那么 shell 会尝试执行命令(就像我输入了bash somefile)。我不相信这一点,但我只是尝试了一下,结果是正确的。所以我显然对这里实际发生的事情有一些误解,并想了解机制。

当我在我的 shell 中执行一个文件时到底发生了什么?(尽可能多的细节是合理的......)

shell kernel exec shebang

38
推荐指数
3
解决办法
5761
查看次数

sh -x 和 ./ 脚本执行的区别

所以我有一个简单的shell脚本。这两个命令在执行中有什么区别?有没有首选的方法?

$sh -x foobar.sh

或者

$ ./foobar.sh

我发现脚本与第二个命令一起使用时执行速度较慢。

scripting bash shell-script

6
推荐指数
2
解决办法
2万
查看次数

第一行脚本

第一行的#!/bin/bash 是什么意思?它是否只是一个注释并像程序中的所有其他注释一样被 shell 忽略

或者

解释器只解释这一行,而从 # 开始的所有其他行都被忽略,除了 #!/bin/bash。

shell shell-script

3
推荐指数
2
解决办法
2万
查看次数

bash -c 和非交互式 shell

来自https://unix.stackexchange.com/a/276611/674

当 bash 使用 -c 运行时,它被认为是一个非交互式 shell,它不会读取 ~/.bashrc,除非指定了 -i。

  1. 非交互式 shell 是如何定义的?

    • 非交互式 shell 是否定义为不能接受来自 stdin 的输入的 shell?例如bash -c cat可以接受来自标准输入的输入。

    • 非交互式 shell 可以输出到标准输出吗?例如,bash -c date可以写入标准输出。

  2. 是否bash -c(没有附加-i选项)总是创建一个非交互式 shell?

bash

1
推荐指数
1
解决办法
5014
查看次数

`bash -i -c <command>` 创建的 shell 是交互式的吗?

来自https://unix.stackexchange.com/a/276611/674

bash与 一起运行时-c,它被认为是一个非交互式 shell ~/.bashrc,除非-i指定,否则它不会读取。所以,

$ 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
Run Code Online (Sandbox Code Playgroud)

shell 是由bash -i -c <command>交互式还是非交互式创建的?

这样的 shell 不接受来自 stdin 的命令,是吗?所以它不是交互式的,是吗?

这样的 shell 读取~/.bashrc,所以它不能是非交互式的,对吗?

bash

1
推荐指数
1
解决办法
2347
查看次数

标签 统计

bash ×3

scripting ×2

shebang ×2

shell ×2

shell-script ×2

exec ×1

executable ×1

kernel ×1