为了理解另一个答案(由 glenn jackman):
find / -type d -print0 | while read -r -d '' dir; do ls -ltr "$dir" | sed '$!d'; done
Run Code Online (Sandbox Code Playgroud)
第一步骤是要了解该选项的使用-r的的read命令。
首先,我想,简单地执行就足够了
man read
Run Code Online (Sandbox Code Playgroud)
查找-r选项的含义,但我意识到手册页根本不包含任何对选项的解释,所以我搜索了它。我得到了一些read -t,read -p例子,但是没有read -r。
如何在 Linux 中使用命令行或以编程方式分别获得读写 IOPS?我已经安装了sysstat包。
请告诉我如何使用sysstat包命令分别计算这些。
或者,是否可以使用文件系统计算它们?
例如: /proc或/sys或/dev
使用 ksh 我使用 read 作为分隔值的便捷方法:
$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a
2 1
$
Run Code Online (Sandbox Code Playgroud)
但它在 Bash 中失败了:
$ echo 1 2 3 4 5 | read a b dump
$ echo $b $a
$
Run Code Online (Sandbox Code Playgroud)
我没有在手册页中找到失败的原因,知道吗?
我读到写这样的东西很糟糕for line in $(command),正确的方法似乎是:
command | while IFS= read -r line; do echo $line; done
Run Code Online (Sandbox Code Playgroud)
这很好用。但是如果我想要迭代的是变量的内容,而不是命令的直接结果呢?
例如,假设您创建了以下文件quickfox:
The quick brown
foxjumps\ over -
the
lazy ,
dog.
Run Code Online (Sandbox Code Playgroud)
我希望能够做这样的事情:
# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect
Run Code Online (Sandbox Code Playgroud) 在一些类似Bourne shell中,read内建无法读取从文件中的整条生产线/proc(该命令下面应当运行zsh,替换$=shell与$shell其他shell):
$ for shell in bash dash ksh mksh yash zsh schily-sh heirloom-sh "busybox sh"; do
printf '[%s]\n' "$shell"
$=shell -c 'IFS= read x </proc/sys/fs/file-max; echo "$x"'
done
[bash]
602160
[dash]
6
[ksh]
602160
[mksh]
6
[yash]
6
[zsh]
6
[schily-sh]
602160
[heirloom-sh]
602160
[busybox sh]
6
Run Code Online (Sandbox Code Playgroud)
read标准要求标准输入必须是一个文本文件,这个要求会导致不同的行为吗?
阅读文本文件的POSIX定义,我做了一些验证:
$ od -t a </proc/sys/fs/file-max
0000000 6 0 2 1 6 0 nl
0000007
$ find …Run Code Online (Sandbox Code Playgroud) 我有一个连接到远程服务器并检查是否安装了某些软件包的脚本:
ssh root@server 'bash -s' < myscript.sh
Run Code Online (Sandbox Code Playgroud)
我的脚本.sh:
OUT=`rpm -qa | grep ntpdate`
if [ "$OUT" != "" ] ; then
echo "ntpdate already installed"
else
yum install $1
fi
Run Code Online (Sandbox Code Playgroud)
这个例子可以简化。这是myscript2.sh有同样问题的:
read -p "Package is not installed. Do you want to install it (y/n)?" choise
Run Code Online (Sandbox Code Playgroud)
我的问题是 bash 无法以交互方式阅读我的答案。
有没有办法远程执行本地脚本而不会失去提示用户的能力?
我有以下脚本:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常。但我不明白这些:
<&3done < file11 3< file22巧合的是,我不得不使用我的 ATA-ID-to-device-name 脚本(在这里找到:https : //serverfault.com/questions/244944/linux-ata-errors-translating-to-a-device-name/ 426561#426561 ) 在只读 /分区上。如果你好奇,它是一个 Ubuntu 恢复控制台,它可以让你访问你的/分区,但默认情况下它会以只读方式挂载。我对此很高兴,因为否则我可能永远不会发现我的脚本由于特定行而在 R/O 系统上表现得很奇怪,这个:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Run Code Online (Sandbox Code Playgroud)
这并不会在没有写权限的工作。不过,我不会认为它会失败。但显然<<<操作员确实需要将一些临时文件写入某个地方。
但是有没有办法绕过临时文件的创建,或者,有没有办法指定文件的写入位置?在 Ubuntu 恢复控制台中,有——奇怪的是——对/run目录的写权限,如果我能以某种方式“告诉”read将临时文件写入其他地方而不是平常,那就可以了。
我有一个用例,我需要在每次迭代开始时读入多个变量,并将用户的输入读入循环。
我不知道如何探索的解决方案的可能途径-
使用for循环而不是... | while read .........我不知道如何在for循环内分配多个变量
echo -e "1 2 3\n4 5 6" |\
while read a b c;
do
echo "$a -> $b -> $c";
echo "Enter a number:";
read d ;
echo "This number is $d" ;
done
Run Code Online (Sandbox Code Playgroud)bash 手册页说明了有关read内置的以下内容:
退出状态为零,除非遇到文件尾
这最近咬了我,因为我-e设置了选项并使用以下代码:
read -rd '' json <<EOF
{
"foo":"bar"
}
EOF
Run Code Online (Sandbox Code Playgroud)
我只是不明白为什么在这种情况下非成功退出是可取的。在什么情况下这会有用?