关于脚本:shell在shell中意味着什么?

关于脚本:shell在shell中意味着什么?

What does $$ mean in the shell?

我曾经读过,在shell中为临时文件获取唯一文件名的一种方法是使用双美元符号($$)。 这会产生一个随时变化的数字......但是如果你反复调用它,它会返回相同的数字。 (解决方案是使用时间。)

我很想知道$$实际上是什么,以及为什么它会被建议作为生成唯一文件名的方法。


$$是bash中的进程ID(PID)。使用$$是一个坏主意,因为它通常会创建竞争条件,并允许攻击者破坏您的shell脚本。例如,请参阅创建不安全临时文件并且必须发布安全建议的所有这些人。

而是使用mktemp。 mktemp的Linux手册页很棒。这是一些示例代码:

1
2
3
tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo"program output">> $TMPFILE

在Bash中,$$是进程ID,如注释中所述,由于各种原因,它不能安全地用作临时文件名。

对于临时文件名,请使用mktemp命令。


$$是当前进程的id。


UNIX操作系统中的每个进程都有一个(临时)唯一标识符PID。没有两个进程同时运行可以具有相同的PID,$$指的是运行脚本的bash实例的PID。

从某种意义上说,它绝不是一个独特的识别器,它永远不会被重用(实际上,PID会不断被重用)。它给你的功能是一个数字,如果另一个人运行你的脚本,当你的脚本仍在运行时,他们会得到一个不同的标识符。一旦你死了,PID可以被回收,其他人可能会运行你的脚本,得到相同的PID,所以得到相同的文件名。

因此,只有说"$$给出一个文件名,如果其他人运行相同的脚本,我的实例仍在运行,他们会得到一个不同的名称",这真是理智。


$$是你的PID。它并没有真正生成一个唯一的文件名,除非你小心,没有其他人以完全相同的方式。

通常你会创建像/ tmp / myprogramname $$这样的东西

有很多方法可以解决这个问题,如果你写的是其他人可以写的地方,那么在许多操作系统上预测你将会拥有什么样的PID并且搞砸是不太困难的 - 假设你正在运行以root身份创建/ tmp / yourprogname13395作为指向/ etc / passwd的符号链接 - 然后你写入它。

这在shell脚本中是一件坏事。如果您打算使用临时文件,您应该使用更好的语言,这至少可以让您添加"独占"标志来打开(创建)文件。然后你可以确定你没有破坏别的东西。


让我第二个emk的答案 - 不要将$$本身用作"独特"的任何东西。对于文件,请使用mktemp。对于同一bash脚本中的其他ID,请使用"$$$(日期+%s%N)"以获得相当大的唯一性。

1
 -k


$$是运行脚本的shell的进程ID。有关更多详细信息,请参阅sh或bash的手册页。可以使用命令行"man sh"或通过在Web上搜索"shell manpage"找到手册页


$$是当前shell进程的pid。这不是生成唯一文件名的好方法。


$$是运行脚本的shell解释器的pid(进程ID)。现在在系统上运行的每个进程都不同,但随着时间的推移,pid会回绕,并且在你退出之后将会有另一个具有相同pid的进程。只要你正在运行,pid就是你所独有的。

从上面的定义可以看出,无论您在脚本中使用$$多少次,它都会返回相同的数字。

你可以使用,例如/tmp/myscript.scratch.$$作为临时文件,用于不需要非常可靠或安全的东西。在脚本末尾删除此类临时文件是一种很好的做法,例如使用trap命令:

1
trap"echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT

它是bash进程的进程ID。没有并发进程将具有相同的PID。


Also, You can grab login username via this command. Eg.

1
echo $(</proc/$$/login id). After that, you need to use getent command.


推荐阅读

    linux命令匹配数字?

    linux命令匹配数字?,数字,档案,位置,环境,名字,较大,系统,权限,命令,用户,Lin

    linux权限数字命令?

    linux权限数字命令?,数字,系统,地址,权限,命令,标准,情况,管理,基础,文件,lin

    linux脚本多个命令?

    linux脚本多个命令?,系统,工作,标准,服务,命令,软件,管理,连续,电脑,设备,lin

    linux脚本注释命令?

    linux脚本注释命令?,代码,系统,工作,名称,地方,脚本,命令,信息,状态,简介,lin

    脚本运行linux命令?

    脚本运行linux命令?,系统,环境,工具,工作,位置,底部,代码,发行,官网,终端,lin

    linux命令下写脚本?

    linux命令下写脚本?,服务,系统,环境,代码,名称,命令,脚本,发行,在线,情况,三

    linux把命令变成脚本?

    linux把命令变成脚本?,系统,环境,工作,脚本,命令,信息,基础,代码,文件,变量,

    脚本调用linux命令?

    脚本调用linux命令?,代码,系统,工作,底部,脚本,位置,环境,行用,官网,标准,typ

    linux脚本命令输信息?

    linux脚本命令输信息?,系统,信息,代码,脚本,数据,工具,发行,命令,变量,文件,l

    linux命令交换文件名?

    linux命令交换文件名?,命令,文件,数据,名称,工具,地址,软件,系统,基础知识,

    linux上启动脚本命令?

    linux上启动脚本命令?,服务,状态,系统,代码,脚本,工作,周期性,命令,文件,方

    linux排序数字命令?

    linux排序数字命令?,标准,数字,单位,情况,系统,信息,命令,文件,顺序,参数,lin

    linux下编写脚本命令?

    linux下编写脚本命令?,代码,时间,工具,标准,系统,实战,平台,最新,网站,文件,l

    linux命令不能打数字?

    linux命令不能打数字?,工作,密码,数字,地址,电脑,系统,命令,设备,下来,预期,

    linux定时器脚本命令?

    linux定时器脚本命令?,系统,代码,时间,工具,工作,定期,周期性,异常,任务,脚

    linux停止脚本命令行?

    linux停止脚本命令行?,系统,工作,平台,命令,基础,第一,环境,信息,终端,程序,

    linux命令运行脚本?

    linux命令运行脚本?,代码,系统,工作,设计,状态,命令,脚本,文件,目录,终端,运

    linux脚本赋权限命令?

    linux脚本赋权限命令?,系统,档案,工作,命令,工具,脚本,权限,文件,程序,文件

    linux查找文件名命令?

    linux查找文件名命令?,系统,信息,工具,命令,文件,字符串,样式,管道,文本,动

    linux关闭脚本命令?

    linux关闭脚本命令?,系统,服务,状态,命令,档案,暂停,软件,工具,数据,电脑,lin