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

为什么在bash中运行echo $$返回一个像7190这样的数字,而运行echo $只返回$

惯例。

$$ :扩展为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 

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

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

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

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

正如您在带有$$$$的评论中所述,您将返回相同的进程ID两次。


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

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

这是从锁屏定时器中获取的$$的真实应用:

 # Check if lock screen timer already running pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$) if [ "$PREVIOUS" != "" ]; then kill "$PREVIOUS" rm ~/.lock-screen-timer-remaining zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated." fi 

在这段代码中:

 PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy 

使用当前运行进程( $$ )从以相同名称运行的所有进程列表中删除它(用非-v表示)(在本例中为lock-screen-timer )。

如果有以前运行的副本,则代码会将其删除并删除它正在使用的工作文件。