为什么 echo $$ 返回一个数字?

Ner*_*nux 6 command-line bash echo

为什么运行echo $$inbash返回一个数字7190,而运行echo $只返回一个$

Rin*_*ind 18

习俗。

$$: 扩展到 shell 的进程 ID。在 () 子shell 中,它扩展为调用shell 的进程ID,而不是子shell(请参阅下面的手册链接)。

rinzwind@schijfwereld:~$ echo $$
3244
rinzwind@schijfwereld:~$ ps -ef |grep 3244
rinzwind  3244  3237  0 19:06 pts/0    00:00:00 /bin/bash
Run Code Online (Sandbox Code Playgroud)

在编码软件时非常有用。它可以用作mktemp创建临时文件的粗略(将是更好的方法)方式

1$没有特殊意义,所以它给你回声总是做的事情:返回它。

有一个专门用于此的手册页(3.4.2 特殊参数)。

  • @NerdOfLinux 它两次返回相同的数字 (6认同)
  • @NerdOfLinux 不是吗?它显示相同的数字 2 次 (4认同)
  • @MontyHarder:tmp 文件的可预测名称(如`/tmp/myscript.$$`)通常是一个安全漏洞。如果您无法避免首先需要 tmp 文件,请参阅 http://www.linuxsecurity.com/content/view/115462/151/ 了解为什么 `mktemp` 是正确的方法。但是,出于您指出的原因,在`mktemp` 模板中包含脚本的PID 是一个好主意。 (4认同)

Rav*_*ina 11

在 bash 中使用我们使用的变量来声明$,使用$$第一个美元符号我们是说我想使用一个变量,使用第二个我们告诉该变量的名称实际上是 a $。它实际上是一个命名约定,这个变量包含当前 shell 的进程 id。

正如您在评论中所问的那样,$$$$您将两次返回相同的进程 ID。


还有其他变量(从这里):

  • $1, $2, $3, ... 是位置参数
  • "$@"是所有位置参数的类似数组的构造,{$1, $2, $3 ...}
  • "$*"是所有位置参数的 IFS 扩展,$1 $2 $3 ...
  • $# 是位置参数的数量。
  • $- 为 shell 设置的当前选项。
  • $$ 当前shell(不是子shell)的pid。
  • $_ 最近的参数(或启动后立即启动当前 shell 的命令的 abs 路径)。
  • $IFS 是(输入)字段分隔符。
  • $? 是最近的前台管道退出状态。
  • $! 是最近的后台命令的PID。
  • $0 是 shell 或 shell 脚本的名称。