为什么运行 会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
在本例中)。
如果之前有运行的副本,代码会终止它并删除它正在使用的工作文件。