小编Cha*_*ffy的帖子

为什么 alias foo='echo "This is a quote: \'"' 不起作用?

当我尝试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编辑文本时忽略它。然后所有的实际问题都消失了。

你能帮助我吗?我需要解决这个令人困惑的问题。

zsh quoting

23
推荐指数
4
解决办法
7074
查看次数

为什么 "$$" 在 bash 管道中没有改变?他们不启动子流程吗?

我运行以下代码:

echo $$
# Output : 3911
true | while true; do
    eval 'echo $$'
    break
done
# Output : 3911
Run Code Online (Sandbox Code Playgroud)

文档说 while 循环(涉及管道)在子进程中运行,在这种情况下,两个进程 ID 是否应该不同?

shell bash process

17
推荐指数
1
解决办法
624
查看次数

如果在 bash 中使用 while 读取循环进行文本处理很糟糕……那我该怎么办?

我想这可能是一个幼稚的问题,但我无法理解,所以我想问......我正在寻找问题的一些解决方案,当我发现这篇非常有趣的帖子关于为什么[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)。

shell bash shell-script

16
推荐指数
4
解决办法
4981
查看次数

为什么“cat {foo}”不输出foo,而“cat {foo,bar}”会输出?

我试图连接子文件夹中的文本文件并尝试:

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)

这一次它确实成功了,成功地连接了文件。为什么会发生这种情况?

bash brace-expansion cat

12
推荐指数
2
解决办法
1863
查看次数

我可以拆分为两个字符,只运行一次 awk 吗?

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)

awk

7
推荐指数
4
解决办法
804
查看次数

bash 中的“foo &amp;&amp; bar || baz”与“if foo; then bar; else baz”的行为不同

我想

[ 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)

bash shell-script

6
推荐指数
2
解决办法
1564
查看次数

提取连接的 cpio 档案

Linux 上的 initramfs 档案可以由一系列串联的、gzipped cpio 文件组成。

给定这样的档案,如何提取所有嵌入的档案,而不是仅提取第一个?

下面是一个模式的例子,虽然它看起来有可能工作,但只提取第一个存档:

while gunzip -c | cpio -i; do :; done <input.cgz
Run Code Online (Sandbox Code Playgroud)

我还尝试了dracutskipcpio 帮助程序将文件指针移过第一个 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)

linux initramfs cpio

5
推荐指数
3
解决办法
4045
查看次数

为什么 ''cat "${1:-/dev/stdin} | ... &amp;&gt;/dev/null'' 在 bash 中工作而不在 dash 中工作?

脚本:

#!/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 不被守护进程。

shell bash pipe io-redirection dash

5
推荐指数
3
解决办法
2331
查看次数

为什么 $1 在 $'...' 中使用时不起作用?

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”作为文本行。为什么不打印“测试”,我怎样才能做到这一点?

bash

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