手册页cp(1)
说
--no-clobber
不要覆盖现有文件
但是,下面的场景是不是可能呢?
cp
检查文件是否存在,假设文件不存在(还)cp
不知道现在存在的文件,它会覆盖数据是否cp --no-clobber
容易受到这种竞争状态?如果没有,如何cp
避免上述情况?
我刚刚注意到,POSIXdate
似乎没有%s
或%N
格式项。所以我不能使用那些。在我的 shell 脚本中获取纪元时间戳的替代方法是什么?
我想用来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
提供所需的输出。)
我已经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-ip
bin 包。
% 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
。
如何生成包安装的文件的完整列表?
是
x=$y
Run Code Online (Sandbox Code Playgroud)
和
x="$y"
Run Code Online (Sandbox Code Playgroud)
总是等价的?不知道如何寻找这个。到目前为止,我一直习惯于x="$y"
“安全起见”。但我x=$1
曾经使用过并注意到,显然,我什至不需要额外的双引号。
The Open Group POSIX 文档中定义的行为在哪里?
交互式sh
shell 会话:
$ 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)
为什么这两个示例会产生不同的退出代码?
我想使用2.6.2 参数扩展从字符串中删除前导字符,但惊讶地发现“删除最大前缀模式”不会自动重复该模式。
$ x=aaaaabc
$ printf %s\\n "${x##a}"
aaaabc
Run Code Online (Sandbox Code Playgroud)
如您所见,只有第一个a
已被删除。预期输出为、、或中bc
的任何一个。x=bc
x=abc
x=aabc
x=aaabc
x=aaaabc
a
如果我想从 的开头删除尽可能多的内容,我正在努力弄清楚如何编写该模式$x
。我也没有运气搜索其他线程,因为许多答案都使用 bash,但我正在寻找 POSIX shell 解决方案。
假设我有以下 bash 脚本:
#!/bin/bash
sudo command1
command2
sudo command3
Run Code Online (Sandbox Code Playgroud)
我不想以command2
root身份运行,所以我不会使用sudo
. 因此,只要我执行脚本,就会sudo command1
询问我的密码。不幸的是,command2
大约需要 2 个小时才能完成。所以 sudo 凭证时间戳超时,当脚本到达时sudo command3
,我再次被提示输入密码。
例如,我不想像https://superuser.com/a/149740 中描述的那样永久禁用 sudo 凭据时间戳超时。我只想暂时禁用超时,有效地保留这个 bash 会话的凭据,直到它结束。
如果我用来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)
我是否遗漏了某些内容,或者我必须将两个输出的内容修补在一起?