小编Kah*_*ahn的帖子

echo 0>file.txt 和 echo 0 > file.txt 有什么区别?

我看到这有这样的行为:

[root@divinity test]# echo 0 > file.txt
[root@divinity test]# cat file.txt
0
[root@divinity test]# echo 0> file.txt

[root@divinity test]# cat file.txt

Run Code Online (Sandbox Code Playgroud)

我还注意到,如果我包含"",那么它会按预期工作:

[root@divinity test]# echo 0""> file.txt
[root@divinity test]# cat file.txt
0
Run Code Online (Sandbox Code Playgroud)

我想这只是 IO 重定向的一部分,但我不太明白在echo 0>做什么。

shell io-redirection

28
推荐指数
1
解决办法
4687
查看次数

:>filename.txt 是做什么的?

:>filename.txt
Run Code Online (Sandbox Code Playgroud)

例如:

root@box$ dd if=/dev/zero of=file.txt count=1024 bs=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00536175 s, 196 MB/s
root@box$ ll
total 1024
-rw-r--r-- 1 root root 1048576 Nov 15 14:40 file.txt
root@box$ :>file.txt
root@box$ ll
total 0
-rw-r--r-- 1 root root 0 Nov 15 14:40 file.txt
Run Code Online (Sandbox Code Playgroud)

这与rm?不同吗?它是否比其他类似的将文件归零或删除的方法运行得更快或更慢?

shell bash rm

23
推荐指数
2
解决办法
2896
查看次数

为什么 echo > 1 2 3 创建一个名为 1 的文件,内容为 2 3?

$ echo > 1 2 3; ls -latr 1; cat 1
-rw-rw-r-- 1 kahn kahn 4 Jun 23 14:05 1
2 3
Run Code Online (Sandbox Code Playgroud)

这与>重定向的评估有关吗?这样:

echo > 1 2 3
Run Code Online (Sandbox Code Playgroud)

也可以重写为 并且在技术上是:

echo 2 3 > 1
Run Code Online (Sandbox Code Playgroud)

?

是否有任何资源可以更好地理解 IO 重定向的操作顺序及其评估方式?我承认这个例子可能没什么用,甚至不会经常出现,但我想更好地了解这里到底发生了什么。

io-redirection echo

11
推荐指数
1
解决办法
2334
查看次数

SSH 连接到文件中的多个主机并运行命令失败 - 仅转到第一个主机

我有这个脚本:

#!/bin/sh
SERVERLIST=hosts
ICMD='cat /etc/redhat-release'
while read SERVERNAME
do
   ssh $SERVERNAME $ICMD
done < "$SERVERLIST"
Run Code Online (Sandbox Code Playgroud)

随着hosts就像:

hostname
hostname
hostname
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,./run.sh它只会转到单个主机并停止。为什么不读取整个主机列表?

ssh

8
推荐指数
2
解决办法
867
查看次数

设备不包含可识别的分区表

我想在主机上增加 ext4 卷,但我注意到没有有效的分区表可供删除和重制:

fdisk -u /dev/vdb
/dev/vdb: device contains a valid 'ext4' signature; it is strongly recommended to wipe the device with wipefs(8) if this is unexpected, in order to avoid possible collisions

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xd2971c02.

root@host:~# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  20G  0 disk 
`-vda1 253:1    0  20G  0 part /
vdb    253:16   0   1T  0 disk /mnt/redacted
vdc …
Run Code Online (Sandbox Code Playgroud)

partition ext4 fdisk

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

如果 !&lt;命令&gt; (...) 与 &lt;命令&gt; ;如果 [ $? -eq 0] (...)

我正在编写 shell 脚本,并决定通过shellcheck.net检查我的工作。我能够在脚本中获得以下两行的功能相同的行为:

findmnt /dev/sda1 >/dev/null ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)

if ! findmnt /dev/sda1 >/dev/null; then echo 0; else echo 1; fi
Run Code Online (Sandbox Code Playgroud)

然而 shellcheck会抛出

SC2181:直接使用“if mycmd;”检查退出代码,而不是间接使用$?。

我并不清楚该使用哪个。我确实看到: https: //github.com/koalaman/shellcheck/issues/1167似乎已针对几个可能的值对此进行了修改。我想确保我正在编写的内容使用最佳实践,并且可以毫无问题地运行并准确报告。

scripting control-flow shellcheck

5
推荐指数
1
解决办法
4327
查看次数

将所有用户的时钟设置为 24 小时格式

在 Fedora 30 上,我目前在桌面环境中以 24 小时格式显示日期。我正在通过 chronyd 同步时间。但是在 CLI 上,时间显示Fri 22 Nov 2019 02:47:51 PM EST为所有用户。

我想将时间格式设置为使用 24 小时制。timedatectl设置和重新登录作为用户没有任何区别。

fedora clock chrony

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

cpulimit 实际上并没有限制 CPU 使用率

我打电话cpulimitcron

00 16 * * * /usr/bin/cpulimit --limit 20 /bin/sh /media/storage/sqlbackup/backups.sh

当作业开始时,CPU 会像往常一样出现峰值和警报,没有发生实际可识别的限制。作业本身遍历许多子目录的目录并rsync每次执行's ,我相信这会产生rsync子进程(运行 top 将有一个可用于被调用的 rsync 的 pid,几分钟后它将有一个不同的 pid for rsync)。

我不确定如何正确利用cpulimit以有效限制此过程消耗的使用量。

记住这是一个具有 2G RAM 和 1vCPU 的 VM 可能很重要。

cron rsync cpulimit

3
推荐指数
1
解决办法
1586
查看次数

将变量设置为除法和减法命令的结果

我试图以纪元形式获取 2 个日期的差异,并将数字转换回天数:

EXPIRYEPOCH=$(date --date="$EXPIRYDATE" +%s)
TODAYEPOCH=$(date --date="$TODAYSDATE" +%s)
DAYSLEFT=$(expr ($EXPIRYEPOCH - $TODAYEPOCH) / 86400 )
Run Code Online (Sandbox Code Playgroud)

上面的计算DAYSLEFT失败 - 而下面的减法的单个计算成功:

DAYSLEFT=$(expr $EXPIRYEPOCH - $TODAYEPOCH)
Run Code Online (Sandbox Code Playgroud)

用于设置DAYSLEFT变量(先减后除)的正确格式是什么?

bash expr

3
推荐指数
1
解决办法
2283
查看次数

查找所有不包含匹配子目录的目录并创建它们

我有以下目录结构:

/media/storage/sqlbackup/CUSTOMER1
/media/storage/sqlbackup/CUSTOMER2
...
/media/storage/sqlbackup/CUSTOMER*
Run Code Online (Sandbox Code Playgroud)

每个CUSTOMER*目录可以包含命名的子目录dailyweeklymonthly。如果CUSTOMER*目录不包含dailyOR weeklyOR monthly,我希望它被创建,如果它包含,那么我希望它保留。

前: CUSTOMER1/daily

后: CUSTOMER1/{daily,weekly,monthly}

我试图巧妙地使用 find 来做到这一点,但试图返回所有不匹配的内容。

directory directory-structure mkdir

0
推荐指数
1
解决办法
28
查看次数