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

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

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

答案1

习俗。

$$: 扩展为 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$没有特殊含义,所以它会给你 echo 总是做的事情:返回它。

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

答案2

在 bash 中,为了说明使用变量$,我们使用,使用$$第一个美元符号表示我想要使用一个变量,使用第二个美元符号表示该变量的名称实际上是一个$。它实际上是一种命名约定,并且这个变量包含当前 shell 的进程 id。

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


还有其他变量(来自这里):

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

答案3

以下是$$来自锁屏定时器

# 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 

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

如果之前有运行的副本,代码会终止它并删除它正在使用的工作文件。

相关内容