您好我对某个流程有疑问。这是我在运行这条线时得到的结果:
ls -l /proc/3502/exe
如果我执行此行:
echo "$(xargs -0 < /proc/${pids[0]}/cmdline)"
我得到一个输出:/ bin / bash ./sleeper.sh 10
这是否意味着实际运行的procces是/ bin / bash,之后的所有内容仅作为参数传递给它(Procces:/ bin / bash args它得到:./ skipper.sh 10)??因为我知道最后一部分是脚本的名称和传递给它的参数。
答案 0 :(得分:2)
这是否意味着实际运行的procces是/ bin / bash,之后的所有内容仅作为参数传递给它(Procces:/ bin / bash args它得到:./ skipper.sh 10)??
情况确实如此。当您运行如下脚本:./script
时,程序加载器会解析脚本,查找将告诉它如何运行该脚本的shebang。需要Shebang来区分,例如,来自Bash脚本的Python脚本,或来自Perl脚本。这些脚本实际上由各自的口译员执行,这些口译员通常是/bin/python
,/bin/bash
,/bin/perl
,这就是为什么你看到它列为/bin/bash ./sleeper 10
而不是./sleeper.sh 10
。
例如,假设./script
如下所示:
#!/bin/sh
echo yo
使用./script
运行它会导致系统产生/bin/sh ./script
。 (轶事:由于它是如何工作的,一些shebangs还包括它自己的命令行参数,如#!/usr/bin/perl -T
,这将导致系统将您的脚本生成为/usr/bin/perl -T x
)。
至于为什么脚本看到./sleeper.sh 10
而不是/bin/bash ./sleeper.sh 10
- 它只是Bash(和其他解释器)的工作方式。每个人都可以看到shebang扩展,包括Bash。因此ps ux
将显示/bin/bash ./sleeper.sh 10
。但是,对于你的脚本来说,知道Bash标志和它被调用的Bash路径的确切特定组合是没有意义的,所以Bash剥离它们并仅传递相关的命令行。 Bash尝试使该命令行与常规命令行规则一致,这意味着脚本的第一个参数通常是脚本的路径(caveats),其余参数是传递给脚本的参数
./test
:
#!/bin/bash -i
echo $BASH_ARGV
./test
运行它不会打印任何内容。该过程产生为/bin/bash -i ./test
。./test x y
格式运行x y
。该过程产生为/bin/bash -i ./test x y
。<强>建议强>
广泛建议您忽略可执行文件中的.sh
,.py
,.pl
等扩展名。