每个 C 程序都有一个 main 函数,每个 main 函数都有一个 argv 参数,这个参数是一个字符串数组,这个数组的值是由该 C 程序的父进程在通过 exec* 函数启动它时指定的。

很多人说 Bash 中的 $0 的值就是 bash 这个 C 程序在它的 main 函数中获取到的 argv[0](zeroth argument)的值,我们可以通过 exec 命令的 -a 参数的功能演示一下:

$  ( exec -a foo bash -c 'echo $0' )

foo

$ ( exec -a ... bash -c 'echo $0' )

...

$  ( exec -a "" bash -c 'echo $0' )

但并不都是这样,在两种情况下,$0 的值不是 argv[0]:

bash -c '...' foo bar ...

$  bash -c 'echo $0 $1' foo bar

foo bar

这个时候 bash 程序的 argv[0] 是 “bash”,但 $0 却是 “foo”。也就是说如果 -c 选项的参数后面还有参数,那么那些参数会依次成为 $0(覆盖了旧的值 argv[0])、$1、$2...。

bash /a/b/c.sh

$  cat foo.sh

echo $0

$ bash foo.sh

foo.sh

$ bash ./foo.sh

./foo.sh

$ ./foo.sh

./foo.sh

这个时候 bash 程序的 argv[0] 还是 “bash”,但 $0 却是 “foo.sh”。也就是说,当执行一个脚本时,$0 的值就是那个脚本的相对或绝对路径(你指定的任意合法路径)。你在命令行中输入 ./foo.sh 也一样,因为操作系统会为你执行 /bin/sh ./foo.sh。

关于 $0 的值的这三种情况,Bash 文档其实都有讲,我分别用三种颜色标注相关话语:

($0) Expands to the name of the shell or shell script. This is set at shell initialization. If Bash is invoked with a file of commands (see Shell Scripts), $0 is set to the name of that file. If Bash is started with the -c option (see Invoking Bash), then $0 is set to the first argument after the string to be executed, if one is present. Otherwise, it is set to the filename used to invoke Bash, as given by argument zero.

Bash 中的 $0 在什么时候不是 argv[0]相关推荐

  1. 如何检查Bash中是否设置了变量?

    我如何知道是否在Bash中设置了变量? 例如,如何检查用户是否将第一个参数赋予函数? function a {# if $1 is set ? } #1楼 检查是否设置了变量 var="&q ...

  2. Bash中执行存储过程或普通的SQL命令

    演示: 在bash中执行一个存储过程和一个普通的SQL语句 0. 前提条件: 数据库:Oracle10g 表:oracle自带的emp表,默认有数据如下: 1. 在bash中执行oracle存储过程 ...

  3. 如何在bash中等待多个子进程完成并在任何子进程以代码!= 0结尾时返回退出代码!= 0?

    如何在bash脚本中等待从该脚本派生的多个子进程完成并返回退出代码!= 0,当任何子进程以代码!= 0结尾时? 简单脚本: #!/bin/bash for i in `seq 0 9`; dodoCa ...

  4. 如何在 bash 中使用索引数组

    数组是一种数据结构,表示具有相同数据类型的对象集合.bash shell中支持两种类型的数组:关联数组或索引数组.在本文中,将演示如何在 bash 中使用索引数组.以下使用 shell 示例来说明索引 ...

  5. 2.7-egrep及bash中的变量

    egrep及扩展的正则表达式 egrep=grep -E grep [OPTIONS] PATTERN [FILE...] 扩展正则表达式的元字符: 字符匹配: .: []: [^]: 次数匹配: * ...

  6. 如何在Bash中加入数组元素?

    如果我在Bash中有这样的数组: FOO=( a b c ) 如何用逗号将元素加入? 例如,产生a,b,c . #1楼 重复使用@无关紧要的解决方案,但是通过避免$ {:1}的替换和避免中间变量的使用 ...

  7. Bash中的管道输出和捕获退出状态

    我想执行Bash中长时间运行的命令,都捕获它的退出状态,并且发球它的输出. 所以我这样做: command | tee out.txt ST=$? 问题在于变量ST捕获了tee而不是命令的退出状态. ...

  8. 如何在Bash中比较字符串

    如何将变量与字符串进行比较(如果匹配则执行某些操作)? #1楼 要将字符串与通配符进行比较,请使用 if [[ "$stringA" == *$stringB* ]]; then# ...

  9. 如何在Bash中的分隔符上拆分字符串?

    我将此字符串存储在变量中: IN="bla@some.com;john@home.com" 现在我想用拆分字符串; 分隔符,以便我有: ADDR1="bla@some.c ...

最新文章

  1. Android LayoutInflater 的使用
  2. android linux内核开发环境,定制Android 4.2.2开发环境
  3. 【对比学习】koa.js、Gin与asp.net core——中间件
  4. django-自定义过滤器
  5. Remoting入门实例
  6. 想转行数据分析,看完这篇再做决定
  7. Android开源框架Afinal第一篇——揭开圣女的面纱
  8. 熊猫merge()–合并两个DataFrame对象
  9. 递归的Fibonacci在数羊
  10. 华为交换机vlan配置教程
  11. android车载导航测试,嘟嘟车心安卓车载导航开箱体验
  12. 武汉理工大学计算机学院转专业细则,计算机学院武汉理工大学2009年各学院转专业工作实施细则.doc...
  13. 解决一个远程主机强迫关闭连接的bug
  14. excel怎么设置打印区域_Excel数据太多,无法完整打印在一张纸上?你这样设置即可搞定...
  15. vue计算属性的get和set
  16. JPA 列名无效问题
  17. html中为什么h1比h3小,认识HTML中h1 h2 h3 h4标签
  18. matlab时间转为数字,如何将日期数组(格式'mm/dd/yy HH:MM:SS')转换为数字?
  19. 【已解决】winmm.dll被报病毒的解决方案
  20. php登录调用验证码,PHP编写登录验证码功能 附调用方法

热门文章

  1. 获取指定个数指定范围的随机数
  2. Linux启动报错UNEXPECTED INCONSISTENCY解决方法
  3. lvm 逻辑卷的快照及备份 还原
  4. 吴裕雄 19-Mysql 连接的使用
  5. git bash 界面修改成linux界面
  6. Android AOP之路三 Android上的注解
  7. Intellij IDEA调试
  8. mysql查看数据库和表的占用空间大小
  9. Android笔记(八) Android中的布局——相对布局
  10. LeetCode:Add Two Numbers