我正在看这个简短的例子,但我没有看到这个函数是如何工作的:
function EXT_COLOR () { echo -ne "\[\033[38;5;$1m\]"; }
Run Code Online (Sandbox Code Playgroud)
AFAIK-ne代表不相等。我们在这里比较什么?我只看到一个变量(字符串):"\[\033[38;5;$1m\]". 看起来它与比较的结果相呼应,但没有与之比较的变量。
我不确定 readline 是否真的缺少,但问题是 shell(而不是 bash),当我单击向上和向下箭头时,我得到以下而不是命令历史记录:
$ ^[[A^[[A^[[A^[[A^[[A^[[A^[[A
Run Code Online (Sandbox Code Playgroud)
缺少了什么?
从我读到的内容来看,dash可以使用以下命令将其制作为 shell
~$ chsh shirish
Password:
Changing the login shell for shirish
Enter the new value, or press ENTER for the default
Login Shell [/bin/bash]:
Run Code Online (Sandbox Code Playgroud)
我只需要安装dash并给出登录shell的路径/bin/dash。如果我这样做,它不会读取.bashrc但可能正在读取.profile. 这是我的,我.bashrc可以只是剪切和粘贴.bashrc,破折号的行为将与 bash 在历史记录大小、提示类型和我想要或不想要的 cowsay 实例方面完全一样吗?
这是我的.bashrc。
$ cat .bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;; …Run Code Online (Sandbox Code Playgroud) 在bashor 中zsh,我可以使用以下语法从管道读取到变量:
echo AAA BBB | read X Y ; echo $X
Run Code Online (Sandbox Code Playgroud)
这将打印 AAA
为什么同样不起作用/bin/sh?
我在 Debian 中使用/bin/sh-> /bin/dash dash
一些 sed在后台运行时,命令似乎会失败。下面的最小示例。
一个sed命令附加append在以星号开头的行块之后*。另一个只是替换一个词。sed命令的顺序无关紧要。
TEXT=$'* first\n'
two_seds(){ echo "$TEXT" | \
sed "$!N;/.*\n\*/! s/\n\(.*\)/\nappend\n\1/;P;D" | \
sed "s/first/second/";}
Run Code Online (Sandbox Code Playgroud)
执行two_seds & wait结果:
* second
append
Run Code Online (Sandbox Code Playgroud)
执行wait & two_seds产量时:
* second
Run Code Online (Sandbox Code Playgroud)
所以第二个sed命令总是有效,而第一个命令在&.
虽然现在我知道如何解决它,但我很想了解发生了什么。部分是出于好奇,部分是为了以后在模糊的边缘情况下它不会咬我。
可以在bash或 中复制dash。跑步:
Ubuntu 18.04
sed (GNU sed) 4.4
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
dash, version 0.5.8-2.10
Run Code Online (Sandbox Code Playgroud) #!/bin/sh --
for set_trap_sig in HUP INT QUIT ALRM TERM; do
trap -- '
trap -- - '"${set_trap_sig:?}"' EXIT || exit "$?"
kill -s '"${set_trap_sig:?}"' -- "$$" || exit "$?"' "$set_trap_sig"
done
sleep 15 || exit "$?"
Run Code Online (Sandbox Code Playgroud)
这是我向脚本发送 SIGINT 时发生的情况
user@hostname:/tmp$ ./script.sh
^C./script.sh: 3: ./script.sh: Syntax error: EOF in backquote substitution
Run Code Online (Sandbox Code Playgroud)
这个问题似乎是针对 dash 的。在 ash、bash 和 ksh93 上我没有收到此错误。这特别奇怪,因为我的脚本甚至不包含反引号字符。
如果我删除第 5 行末尾的双引号,$?错误就会消失。
我是在做一些愚蠢的事情还是dash行为不当?请不要对我的脚本中的错误检查级别发表评论。
我们现在已经确定这是一个非常严重的错误,甚至影响现代版本的 Ubuntu 和 Debian。有谁知道解决方法?
我正在为我的 dotfiles 编写部署脚本,它们存储在 Git 裸存储库中,我从那里git checkout将文件放到我的主目录中,为了在没有数千个 Git 检出错误的情况下无缝地执行它,我必须删除已经存在的那些(.bashrc例如),我实际上是用以下命令检索它们
git --git-dir=$HOME/repos/dots --work-tree=$HOME ls-tree --full-tree --full-name --name-only -r HEAD | sed "s|^|/mnt/home/henriquehbr/|"
Run Code Online (Sandbox Code Playgroud)
注意:原因
/mnt是它是我的 chroot 安装的挂载点,我实际上是从我的自定义 Arch Linux 安装映像中运行它的
但是当谈到实际删除这些文件时,我没有成功,问题在于名称中包含空格的文件(Font\ Awesome\ Icons.otf例如)
我已经尝试通过在以下命令序列中通过管道传输上面的命令来引用要删除的每个文件:
<get_dotfiles> | sed "s|^|\"/mnt/home/henriquehbr/|" | sed "s/$/\"/"
Run Code Online (Sandbox Code Playgroud)
上面的方法不起作用,我认为rm是按字面意思处理引号,就好像它们是文件名的一部分
其他试验是通过制作一个很好的for循环:
dotfiles=$(git --git-dir=$HOME/repos/dots --work-tree=$HOME ls-tree --full-tree --full-name --name-only -r HEAD | sed "s|^|/mnt/home/henriquehbr/|")
for dotfile in $dotfiles; do
echo "$dotfile" # Works properly, displays dotfile path
rm "$dotfile" # Doesn't …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 GRASS GIS 的 CLI 中调用这个 shell 脚本:
for (( day=5; day<367; day+5 )); do
# commands that I've tested without a loop.
done
exit 0
Run Code Online (Sandbox Code Playgroud)
返回
Syntax error: Bad for loop variable
Run Code Online (Sandbox Code Playgroud) 我遇到了 bash/dash 这个奇怪的参数扩展,我没有找到任何参考。这种扩展叫什么?它在哪里记录?
$ /???
bash: /bin: Is a directory
$ /????
bash: /boot: Is a directory
$ /?????
bash: /cdrom: Is a directory
$ /??????
bash: /libx32: Is a directory
Run Code Online (Sandbox Code Playgroud) 为什么当您运行替换命令时,执行顺序会被破坏,如下例所示。首先chmod执行命令,echo 1然后echo 2?
echo $(echo 1; echo 2; chmod 444 nonexistent_file)
Run Code Online (Sandbox Code Playgroud)
结果:
chmod: Cannot access 'nonexistent_file': No such file or directory
1 2
Run Code Online (Sandbox Code Playgroud) dash ×10
bash ×7
shell ×5
shell-script ×2
arch-linux ×1
ash ×1
command-line ×1
debian ×1
for ×1
login ×1
quoting ×1
rm ×1
sed ×1