我看到这有这样的行为:
[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>做什么。
:>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?不同吗?它是否比其他类似的将文件归零或删除的方法运行得更快或更慢?
$ 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 重定向的操作顺序及其评估方式?我承认这个例子可能没什么用,甚至不会经常出现,但我想更好地了解这里到底发生了什么。
我有这个脚本:
#!/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它只会转到单个主机并停止。为什么不读取整个主机列表?
我想在主机上增加 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) 我正在编写 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似乎已针对几个可能的值对此进行了修改。我想确保我正在编写的内容使用最佳实践,并且可以毫无问题地运行并准确报告。
在 Fedora 30 上,我目前在桌面环境中以 24 小时格式显示日期。我正在通过 chronyd 同步时间。但是在 CLI 上,时间显示Fri 22 Nov 2019 02:47:51 PM EST为所有用户。
我想将时间格式设置为使用 24 小时制。timedatectl设置和重新登录作为用户没有任何区别。
我打电话cpulimit的cron:
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 可能很重要。
我试图以纪元形式获取 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变量(先减后除)的正确格式是什么?
我有以下目录结构:
/media/storage/sqlbackup/CUSTOMER1
/media/storage/sqlbackup/CUSTOMER2
...
/media/storage/sqlbackup/CUSTOMER*
Run Code Online (Sandbox Code Playgroud)
每个CUSTOMER*目录可以包含命名的子目录daily,weekly和monthly。如果CUSTOMER*目录不包含dailyOR weeklyOR monthly,我希望它被创建,如果它包含,那么我希望它保留。
前:
CUSTOMER1/daily
后:
CUSTOMER1/{daily,weekly,monthly}
我试图巧妙地使用 find 来做到这一点,但试图返回所有不匹配的内容。