小编Ern*_*A C的帖子

从子shell退出shell脚本

考虑这个片段:

stop () {
    echo "${1}" 1>&2
    exit 1
}

func () {
    if false; then
        echo "foo"
    else
        stop "something went wrong"
    fi
}
Run Code Online (Sandbox Code Playgroud)

通常当func被调用时它会导致脚本终止,这是预期的行为。但是,如果它在子shell中执行,例如在

result=`func`
Run Code Online (Sandbox Code Playgroud)

它不会退出脚本。这意味着调用代码每次都必须检查函数的退出状态。有没有办法避免这种情况?这set -e是为了什么?

shell shell-script exit subshell

39
推荐指数
3
解决办法
3万
查看次数

如何将 shell 命令嵌入到 sed 表达式中?

我有一个具有以下格式的文本文件:

keyword value
keyword value
...
Run Code Online (Sandbox Code Playgroud)

其中关键字是单个单词,值是行尾之前的所有其他内容。我想从 shell 脚本中读取文件,方式是值(但不是关键字)进行 shell 扩展。

使用 sed 很容易匹配关键字和值部分

input='
keyword value value
keyword "value  value"
keyword `uname`
'

echo "$input"|sed -e 's/^\([^[:space:]]*\)[[:space:]]\(.*\)$/k=<\1> v=<\2>/'
Run Code Online (Sandbox Code Playgroud)

产生

k=<keyword> v=<value value>
k=<keyword> v=<"value  value">
k=<keyword> v=<`uname`>
Run Code Online (Sandbox Code Playgroud)

但问题是如何将 shell 命令嵌入到 sed 表达式的替换部分。在这种情况下,我希望替换为\1 `echo \2`.

shell sed

18
推荐指数
2
解决办法
4万
查看次数

内置返回

根据开放集团的说法,

[t]返回实用程序将导致 shell 停止执行当前函数或点脚本。如果 shell 当前没有执行函数或点脚本,则结果未指定。

但是,如果您运行以下代码段

func () {
    ( return 1 )
    return 0
}
func
echo $?
Run Code Online (Sandbox Code Playgroud)

输出是0(我尝试了 bash 和 dash,结果相同)。因此,这似乎return不会导致 shell 停止执行当前函数,这与 POSIX 标准相矛盾。我错过了什么吗?

shell posix shell-builtin

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

文件名中的保留字符

我的印象是,在文件名中不允许使用的唯一角色是下/的,但我似乎并没有能够创造出其名称的文件中包含的字符,如*,\,",:,|,<或>无论是。例如,

$ echo "*"
> *
$ touch "*"
> touch: setting times of `*': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我正在编写一个要求用户输入文件名的 shell 脚本,我想确保该名称没有任何无效字符。某处有清单吗?

更新:

我没有意识到我是在 FAT32 文件系统(USB 记忆棒)中这样做的,它不允许在文件名中包含“*”和其他字符。怪不得没用。对不起这是我的错!!

shell filenames fat

2
推荐指数
1
解决办法
9525
查看次数

标签 统计

shell ×4

exit ×1

fat ×1

filenames ×1

posix ×1

sed ×1

shell-builtin ×1

shell-script ×1

subshell ×1