使用 bash -c 选项调用脚本

使用 bash -c 选项调用脚本

调用 bash 脚本至少有 3 种可能的方法:

:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"

有人说在案例 #3 调用(-c选项)中层次结构中多了一个 bash 进程。我准备了一个简单的测试脚本:

echo "SHLVL: $SHLVL"  
ps aux | grep bash

SHLVL在 #3 的情况下,变量确实大了一,但ps在 #3 的情况下没有输出任何额外的 bash 进程。与脚本连接的唯一 bash 进程是

bin/bash ./testscript

那么这个额外的 bash 进程在哪里呢?

答案1

实际上,bash 中似乎有一个优化。

让我们编写一个sleep20s脚本:

#! /bin/bash
sleep 20

为了避免歧义,让我们启动一个 ksh shell。

使用此命令:bash -c "./sleep20s",您可以获得:

ksh
  sleep20s
    sleep

哎呀,bash 在哪里?但是如果我们做一些需要 bash 解释器的事情,比如两次调用相同的命令:bash -c "./sleep20s;./sleep20s",那么你会得到:

ksh
  bash
    sleep20s
      sleep

bash 又回来了。因此 bash 可以很聪明,exec在简单情况下使用 an 来启动子脚本。

相关内容