小编fin*_*oot的帖子

`cp --no-clobber` 容易受到竞争条件的影响吗?

手册页cp(1)

--no-clobber 不要覆盖现有文件

但是,下面的场景是不是可能呢?

  1. cp 检查文件是否存在,假设文件不存在(还)
  2. 一些其他进程写入相同的路径,所以现在有数据写入以前不存在的文件
  3. 由于cp不知道现在存在的文件,它会覆盖数据

是否cp --no-clobber容易受到这种竞争状态?如果没有,如何cp避免上述情况?

linux shell security cp files

34
推荐指数
1
解决办法
3220
查看次数

21
推荐指数
2
解决办法
3万
查看次数

在 shell 中获取纪元时间戳的 POSIX 兼容方法是什么?

我刚刚注意到,POSIXdate似乎没有%s%N格式项。所以我不能使用那些。在我的 shell 脚本中获取纪元时间戳的替代方法是什么?

shell-script date posix timestamps time

20
推荐指数
3
解决办法
2988
查看次数

使用 `printf` 打印包含 `%` 百分号的变量会导致 "bash: printf: `p': invalid format character"

我想用来printf打印一个变量。此变量可能包含%百分号。

最小的例子:

$ TEST="contains % percent"
$ echo "${TEST}"
contains % percent
$ printf "${TEST}\n"
bash: printf: `p': invalid format character
contains $
Run Code Online (Sandbox Code Playgroud)

echo提供所需的输出。)

bash echo escape-characters printf variable

19
推荐指数
2
解决办法
2万
查看次数

如何列出已由 APT 包安装的所有文件?

我已经geoip-bin使用以下apt-get命令安装了该软件包:

sudo apt-get install geoip-bin
Run Code Online (Sandbox Code Playgroud)

我想知道使用这个包的命令行命令。
但是当我尝试列出geoip-bin包安装的文件以尝试查找可执行文件时,它没有列在dpkg -S输出中

% dpkg -S geoip-bin
geoip-bin: /usr/share/doc/geoip-bin/changelog.Debian.gz
geoip-bin: /usr/share/lintian/overrides/geoip-bin
geoip-bin: /usr/share/doc/geoip-bin
geoip-bin: /usr/share/doc/geoip-bin/copyright
Run Code Online (Sandbox Code Playgroud)

经过一番研究,我了解到这个包安装了一个 command/executable /usr/bin/geoiplookup。所以在这一点上,我现在知道命令,但为了将来的目的,我想知道如何找出包安装的文件。

进行“反向”文件查找,dpkg -S表明该文件来自geo-ipbin 包。

% dpkg -S /usr/bin/geoiplookup
geoip-bin: /usr/bin/geoiplookup
Run Code Online (Sandbox Code Playgroud)

我想知道是否dpkg -S没有在输出中显示该文件,因为它/usr/bin/geoiplookup是由geoip-bin. 使用 eg 查询依赖项,apt-cache show geoip-bin然后递归查询文件和子依赖项后,仍然无法列出包提供的文件geoip-bin
如何生成包安装的文件的完整列表?

dpkg apt

14
推荐指数
1
解决办法
2万
查看次数

在 POSIX 脚本中,x=$y 是否始终等于 x="$y"?

x=$y
Run Code Online (Sandbox Code Playgroud)

x="$y"
Run Code Online (Sandbox Code Playgroud)

总是等价的?不知道如何寻找这个。到目前为止,我一直习惯于x="$y"“安全起见”。但我x=$1曾经使用过并注意到,显然,我什至不需要额外的双引号。

The Open Group POSIX 文档中定义的行为在哪里?

scripting shell-script posix variable assignment

9
推荐指数
1
解决办法
759
查看次数

具有超时命令的管道的退出状态在交互式 shell 与 shell 脚本中的行为不同

交互式shshell 会话:

$ sh
$ timeout 1 yes | sed -n s/a/b/p ; echo $?
Terminated
143
$ 
Run Code Online (Sandbox Code Playgroud)

非交互式脚本通过sh -c

$ sh -c 'timeout 1 yes | sed -n s/a/b/p ; echo $?'
0
$ 
Run Code Online (Sandbox Code Playgroud)

为什么这两个示例会产生不同的退出代码?

pipe shell-script posix timeout

9
推荐指数
1
解决办法
666
查看次数

使用 POSIX 参数扩展从变量中删除重复的字符串模式

我想使用2.6.2 参数扩展从字符串中删除前导字符,但惊讶地发现“删除最大前缀模式”不会自动重复该模式。

$ x=aaaaabc
$ printf %s\\n "${x##a}"
aaaabc
Run Code Online (Sandbox Code Playgroud)

如您所见,只有第一个a已被删除。预期输出为、、或中bc的任何一个。x=bcx=abcx=aabcx=aaabcx=aaaabc

a如果我想从 的开头删除尽可能多的内容,我正在努力弄清楚如何编写该模式$x。我也没有运气搜索其他线程,因为许多答案都使用 bash,但我正在寻找 POSIX shell 解决方案。

scripting parameter shell-script posix variable

7
推荐指数
3
解决办法
592
查看次数

如何暂时禁用 sudo 凭据时间戳超时?

假设我有以下 bash 脚本:

#!/bin/bash
sudo command1
command2
sudo command3
Run Code Online (Sandbox Code Playgroud)

我不想以command2root身份运行,所以我不会使用sudo. 因此,只要我执行脚本,就会sudo command1询问我的密码。不幸的是,command2大约需要 2 个小时才能完成。所以 sudo 凭证时间戳超时,当脚本到达时sudo command3,我再次被提示输入密码。

例如,我不想像https://superuser.com/a/149740 中描述的那样永久禁用 sudo 凭据时间戳超时。我只想暂时禁用超时,有效地保留这个 bash 会话的凭据,直到它结束。

scripting sudo

6
推荐指数
1
解决办法
1120
查看次数

从“stat”获取 mtime Epoch 时间戳(以毫秒为单位)

如果我用来stat显示 mtime,我会得到一个以毫秒为单位的日期:

$ stat -c '%y' test.log 
2019-07-04 14:32:10.730059167 +0200
Run Code Online (Sandbox Code Playgroud)

但是,如果我想显示纪元时间戳,我将不再获得毫秒:

$ stat -c '%Y' test.log 
1562243530
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了某些内容,或者我必须将两个输出的内容修补在一起?

stat timestamps

6
推荐指数
1
解决办法
9109
查看次数