标签: dash-shell

符合POSIX标准的shell中的数组

根据hyperpolyglot.org上的参考表,可以使用以下语法来设置数组.

i=(1 2 3)
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误的破折号/bin/shUbuntu 的默认值,应该符合POSIX标准.

# Trying the syntax with dash in my terminal
> dash -i
$ i=(1 2 3)
dash: 1: Syntax error: "(" unexpected
$ exit

# Working fine with bash
> bash -i
$ i=(1 2 3)
$ echo ${i[@]}
1 2 3
$ exit
Run Code Online (Sandbox Code Playgroud)

参考表是误导性的还是错误的?
如果是,那么定义数组或列表并且符合POSIX的正确方法是什么?

arrays bash posix dash-shell

9
推荐指数
3
解决办法
3255
查看次数

在一个非常愚蠢的shell中添加/减去变量

我正在编写一个shell脚本,它可以在我的本地上工作/bin/sh(在Ubuntu 13.04上冲刺),但我非常需要在一个愚蠢的盒子上运行它,因为对变量的操作我得到一个错误:

$((n2 - n1 + 1))
Run Code Online (Sandbox Code Playgroud)

不起作用,我收到如下错误:

syntax error: you disabled math support for $((arith)) syntax
Run Code Online (Sandbox Code Playgroud)

我不太了解sh那里,但我认为这件事是忙碌的.我怎么能在这个哑壳上做数学?


编辑小程序列表

~ # busybox --list
[
arp
ash
cat
chgrp
chmod
chown
chroot
chvt
clear
cmp
cp
cut
date
dd
deallocvt
df
dmesg
du
echo
env
false
find
freeramdisk
ftpget
ftpput
grep
gunzip
gzip
hexdump
hwclock
ifconfig
ln
losetup
ls
md5sum
mkdir
mkfifo
mknod
mkswap
more
mount
mv
nslookup
ping
ping6
ps
pwd
renice
reset
rm
rmdir …
Run Code Online (Sandbox Code Playgroud)

math shell busybox dash-shell

7
推荐指数
1
解决办法
4270
查看次数

在 shell 脚本中可移植地捕获 ERR

我正在尝试编写一个 shell 脚本,该脚本在命令失败时中止并显示有问题的行号。

set -e
trap 'echo "$0 FAILED at line ${LINENO}"' ERR
Run Code Online (Sandbox Code Playgroud)

结果发现陷阱行不适用于 Ubuntu 的默认 shell 脚本解释器 dash。如果我将 shebang 行更改#!/bin/bash为此有效但不使用#!/bin/sh. 有没有办法在不依赖 bash 的情况下完成这项工作?

顺便说一句,我从破折号得到的错误是这样的:

trap: ERR: bad trap
Run Code Online (Sandbox Code Playgroud)

error-handling bash shell dash-shell

7
推荐指数
2
解决办法
3037
查看次数

破折号相当于bash的花括号语法?

在bash中,php/{composer,sismo}扩展为php/composer php/sismo.有没有办法用/bin/sh(我相信是破折号),系统shell?我正在写git hooks,希望尽可能远离bash.

dash-shell

6
推荐指数
1
解决办法
726
查看次数

在POSIX shell脚本中嵌入Unicode字符的最佳方法是什么?

有几种特定于shell的方法可以在字符串中包含"unicode literal".例如,在Bash中,引用的字符串扩展机制$''允许我们直接嵌入一个不可见的字符:$'\u2620'.

但是,如果您尝试编写通用的跨平台shell脚本(通常,这可以被截断为"以Bash,Zsh和Dash运行."),这不是便携式功能.

我可以使用如下构造在ASCII表(八进制数字空间)中移植实现任何内容:

WHAT_A_CHARACTER="$(printf '\036')"
Run Code Online (Sandbox Code Playgroud)

...但是,POSIX/Dash printf仅支持八进制转义.

通过将任务转化为更全面的编程环境,我显然也可以实现完整的Unicode空间:

OH_CAPTAIN_MY_CAPTAIN="$(ruby -e 'print "\u2388"')"
TAKE_ME_OUT_TONIGHT="$(node -e 'console.log("\u266C")')"
Run Code Online (Sandbox Code Playgroud)

那么:将这样的字符编码成shell脚本的最佳方法是:

  1. 工程在dash,bashzsh,
  2. 显示代码中代码点的十六进制编码,
  3. 不依赖于字符串的特定编码(即不通过八进制编码UTF-8字节)
  4. 最后,不需要调用任何"重型"解释器.(比方说,运行时间不到0.01秒.)

unicode bash shell posix dash-shell

6
推荐指数
1
解决办法
2400
查看次数

bash:无法在同一行中设置和使用别名

我希望第二行foo代替command not found:

$ alias foo="echo bac" ; foo;
-bash: foo: command not found
$ foo
bac
$
Run Code Online (Sandbox Code Playgroud)

第二行为什么不说foo?使用以下shell进行测试,行为相同:

  • bash 3.2.5
  • zsh 5.0.8
  • 破折号0.5.9
  • busybox 1.25.0

bash zsh busybox dash-shell

6
推荐指数
1
解决办法
276
查看次数

为什么subprocess.Popen返回码与bash的类似命令不同

为什么

import subprocess

p = subprocess.Popen(["/bin/bash", "-c", "timeout -s KILL 1 sleep 5 2>/dev/null"])
p.wait()
print(p.returncode)
Run Code Online (Sandbox Code Playgroud)

回报

[stderr:] /bin/bash: line 1: 963663 Killed                  timeout -s KILL 1 sleep 5 2> /dev/null
[stdout:] 137
Run Code Online (Sandbox Code Playgroud)

什么时候

import subprocess

p = subprocess.Popen(["/bin/bash", "-c", "timeout -s KILL 1 sleep 5"])
p.wait()
print(p.returncode)
Run Code Online (Sandbox Code Playgroud)

回报

[stdout:] -9
Run Code Online (Sandbox Code Playgroud)

如果你将bash改为破折号,那么在这两种情况下你都会得到137.我知道-9是KILL代码而137是128 + 9.但类似的代码获得不同的返回码似乎很奇怪.

发生在Python 2.7.12和python 3.4.3上

看起来在使用时Popen.wait()不会调用Popen._handle_exitstatus https://github.com/python/cpython/blob/3.4/Lib/subprocess.py#L1468,/bin/bash但我无法弄清楚原因.

python bash subprocess dash-shell

6
推荐指数
1
解决办法
310
查看次数

子shell中的循环控制

我想使用子外壳来确保环境更改不会影响循环中的不同迭代,但我不确定我可以在子外壳内使用循环控制语句 ( break, continue):

#!/bin/sh
export A=0
for i in 1 2 3; do
  (
  export A=$i
  if [ $i -eq 2 ]; then continue ; fi
  echo $i
  )
done
echo $A
Run Code Online (Sandbox Code Playgroud)

A循环外的值不受内部发生的任何影响,这没关系。但是允许使用continue子外壳内部还是应该将其移到外部?作为记录,它可以按原样工作,但也许这是一个不可靠的副作用。

bash dash-shell

5
推荐指数
1
解决办法
676
查看次数

如何判断dash的版本号?

我有一个破折号外壳安装为/bin/dash. 我查了dash的手册,和POSIX shell的手册是一样的,没有说shell的版本。

破折号 --version

不起作用。

如何告诉我有破折号的版本号?

补充:有些人指着我使用 Ubuntu 命令,好吧,不,我不是在运行 Ubuntu,我在运行 Centos。

linux centos dash-shell

5
推荐指数
1
解决办法
2981
查看次数

回归:导出的 Bash 函数经过另一个过程后丢失

从 Ubuntu 14.04 迁移到 16.04 时,我注意到我的几个 Bash 脚本由于缺少导出的函数而失败。我想知道这是否与Shellshock 错误的修复有关,即使我只是简单export -f的函数,而不是依赖 Bash 内部函数表示。失败不会发生在直接的 Bash 子 shell 中,只有在两者之间有另一个进程时才会发生。例如,Bash 调用 awk / Perl / Vim 调用另一个 Bash。下面是一个 Perl 的例子:

好的

$ foo() { echo "foobar"; }
$ export -f foo
$ export -f; foo
foo ()
{
    echo "foobar"
}
declare -fx foo
foobar
$ bash -c "export -f; foo"
foo ()
{
    echo "foobar"
}
declare -fx foo
foobar
$ perl -e 'system("bash -c \"export -f; foo\"")'
foo …
Run Code Online (Sandbox Code Playgroud)

bash shellshock-bash-bug dash-shell

5
推荐指数
1
解决办法
311
查看次数