当我尝试shopt在 Zsh 而不是 中使用时,为了提醒自己setopt,我创建了以下别名,首先在 shell 提示符下对其进行测试:
$ alias shopt='echo "You\'re looking for setopt. This is Z shell, man, not Bash."'
Run Code Online (Sandbox Code Playgroud)
尽管外部单引号匹配和内部双引号匹配,并且撇号被转义,但提示我完成关闭引号:
dquote > _
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
似乎转义被忽略了,或者由于多层次的解释需要双重转义......所以,为了测试这个理论,我尝试双重转义它(和三次转义它,等等上)一直到:
alias shopt='echo "You\\\\\\\\\\\\\\\\\\\\\\'re looking for setopt. This is Z shell, man, not Bash." '
Run Code Online (Sandbox Code Playgroud)
并且从未见过任何不同的行为。这对我来说毫无意义。什么样的奇怪伏都教阻止外壳按我预期的方式运行?
实际的解决方案是不使用引号 for echo,因为它实际上并不需要任何引号alias,并且使用双引号 for , 并转义撇号,以便在echo编辑文本时忽略它。然后所有的实际问题都消失了。
你能帮助我吗?我需要解决这个令人困惑的问题。
我运行以下代码:
echo $$
# Output : 3911
true | while true; do
eval 'echo $$'
break
done
# Output : 3911
Run Code Online (Sandbox Code Playgroud)
文档说 while 循环(涉及管道)在子进程中运行,在这种情况下,两个进程 ID 是否应该不同?
我想这可能是一个幼稚的问题,但我无法理解,所以我想问......我正在寻找问题的一些解决方案,当我发现这篇非常有趣的帖子关于为什么[while|for]在 bash 中使用循环被考虑不好的做法。帖子中有一个很好的解释(请参阅所选答案),但我找不到任何可以解决所讨论问题的内容。
我进行了广泛的搜索:我用谷歌搜索(或duckduckgo-ed)how to read a file in bash并且我得到的所有结果都指向一个解决方案,根据上述帖子,该解决方案绝对是非 bash 风格并且应该避免的东西。特别是,我们有这个:
while read line; do
echo $line | cut -c3
done
Run Code Online (Sandbox Code Playgroud)
和这个:
for line in `cat file`; do
foo=`echo $line | awk '{print $2}'`
echo whatever $foo
done
Run Code Online (Sandbox Code Playgroud)
这被认为是非常糟糕的 shell 脚本示例。在这一点上,我想知道,这是实际的问题:如果应该避免发布的 while 循环,因为它们是不好的做法等等……我应该怎么做?
编辑:我看到我已经有评论/问题来解决while循环的确切问题,所以我想扩大一下问题。基本上,我的理解是我需要更深入地研究 bash 命令,这才是我真正应该做的事情。但是,当人们四处搜索时,在一般情况下,人们似乎以不正确的方式使用和教授 bash(根据我的 google-ing)。
我试图连接子文件夹中的文本文件并尝试:
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var
Run Code Online (Sandbox Code Playgroud)
然而,这并没有返回任何东西。因此,尝试添加一个不存在的“subfolder2”
cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var
Run Code Online (Sandbox Code Playgroud)
这一次它确实成功了,成功地连接了文件。为什么会发生这种情况?
ip a 产生一堆 IP 地址和接口状态
有了awk '/inet / {print $2}',我设法获得了 IP 和子网
wolf@linux:~$ ip a | awk '/inet / {print $2}'
127.0.0.1/8
10.10.0.1/24
10.10.1.1/24
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
然后,我将它通过管道传输到另一个 awk 以删除 CIDR 表示法。
wolf@linux:~$ ip a | awk '/inet / {print $2}' | awk -F / '{print $1}'
127.0.0.1
10.10.0.1
10.10.1.1
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
是否可以在不将 awk 输出通过管道传输到另一个 awk 的情况下执行此操作?
期望输出
wolf@linux:~$ ip a | <awk syntax here without additional piping>
127.0.0.1
10.10.0.1
10.10.1.1
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud) 我想
[ 1 -eq $1 ] && echo "yes" || echo "no"
Run Code Online (Sandbox Code Playgroud)
像
if [ 1 -eq $1 ]; then
echo "yes"
else
echo "no"
fi
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个脚本(nocmd是一个不存在的命令)
#!/bin/bash
[ 1 -eq $1 ] && nocmd "yes" || echo "no"
Run Code Online (Sandbox Code Playgroud)
我得到参数“1”的奇怪输出:
me@ubuntu:/tmp$ ./ddd.sh 0
no
me@ubuntu:/tmp$ ./ddd.sh 1
./sh.sh: line 3: nocmd: command not found
no
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
if [ 1 -eq $1 ]; then
nocmd "yes"
if [ $? -ne 0 ]; then
echo "no"
fi
else
echo "no" …Run Code Online (Sandbox Code Playgroud) Linux 上的 initramfs 档案可以由一系列串联的、gzipped cpio 文件组成。
给定这样的档案,如何提取所有嵌入的档案,而不是仅提取第一个?
下面是一个模式的例子,虽然它看起来有可能工作,但只提取第一个存档:
while gunzip -c | cpio -i; do :; done <input.cgz
Run Code Online (Sandbox Code Playgroud)
我还尝试了dracut的skipcpio 帮助程序将文件指针移过第一个 cpio 图像,但以下结果会导致发送到 cpio 的损坏流(不在输入中的正确点):
# this isn't ideal -- presumably would need to rerun with an extra skipcpio in the pipeline
# ...until all files in the archive have been reached.
gunzip -c <input.cgz | skipcpio /dev/stdin | cpio -i
Run Code Online (Sandbox Code Playgroud) 脚本:
#!/bin/sh
#
# reads stdin/file and copies it to clipboard
# clears it after 30s
#
cat "${1:-/dev/stdin}" | timeout 30 xclip -i -selection clipboard -r -verbose &>/dev/null &
Run Code Online (Sandbox Code Playgroud)
我可以看到只有标准输入不起作用(使用 bash 它适用于标准输入/文件)。
PS verbose 用于使 xclip 不被守护进程。
input() {
read -p $'\e[31m\e[1m $1 [Y/n] \e[0m' -n 1 -r
}
input "test"
exit
Run Code Online (Sandbox Code Playgroud)
这只是打印“$1”作为文本行。为什么不打印“测试”,我怎样才能做到这一点?