相关疑难解决方法(0)

你什么时候会使用额外的文件描述符?

我知道您可以创建一个文件描述符并将输出重定向到它。例如

exec 3<> /tmp/foo # open fd 3.
echo a >&3 # write to it
exec 3>&- # close fd 3.
Run Code Online (Sandbox Code Playgroud)

但是你可以在没有文件描述符的情况下做同样的事情:

FILE=/tmp/foo
echo a > "$FILE"
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个很好的例子,说明何时必须使用额外的文件描述符。

shell bash io-redirection file-descriptors

93
推荐指数
5
解决办法
6万
查看次数

如何仅使用 bash 而没有其他任何东西(没有 curl、wget、perl 等)下载文件

我有一个最小的无头 *nix,它没有任何用于下载文件的命令行实用程序(例如,没有 curl、wget 等)。我只有 bash。

如何下载文件?

理想情况下,我想要一个可以在广泛的 *nix 中工作的解决方案。

command-line bash web

51
推荐指数
7
解决办法
6万
查看次数

Bash:将管道的输出分配给变量

我正在尝试将管道的输出转换为变量。我尝试了以下几件事:

echo foo | myvar=$(</dev/stdin)
echo foo | myvar=$(cat)
echo foo | myvar=$(tee)
Run Code Online (Sandbox Code Playgroud)

但是$myvar是空的。

我不想做:

myvar=$(echo foo)
Run Code Online (Sandbox Code Playgroud)

因为我不想生成子shell。

有任何想法吗?

编辑:我不想生成子shell,因为管道之前的命令需要编辑全局变量,而这在子shell中是做不到的。它可以?的echo东西只是为了简化。它更像是:

complex_function | myvar=$(</dev/stdin)
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么这不起作用。这例如:

complex_function | echo $(</dev/stdin)
Run Code Online (Sandbox Code Playgroud)

bash pipe stdin

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

为什么 POSIX 中没有 mktemp 命令?

shell 脚本需要做的最常见的事情之一是创建和操作临时文件。这样做安全是一种痛苦,因为你需要避免名称冲突,避免竞争条件,确保该文件具有正确的权限,等等(参见GNU Coreutils的手册琐碎的博客文章这方面的迹象对这些更详细的讨论问题。)大多数类 Unix 操作系统通过提供mktemp处理所有这些问题的命令来解决这个问题。但是,这些mktemp命令的语法和语义没有标准化。如果您真的想安全可移植地创建临时文件,则必须求助于丑陋的杂物,例如以下内容:

tmpfile=$(
  echo 'mkstemp(template)' |
    m4 -D template="${TMPDIR:-/tmp}/baseXXXXXX"
) || exit
Run Code Online (Sandbox Code Playgroud)

(此变通方法利用了宏处理器m4是 POSIX 的一部分这一事实,并m4公开了mkstemp()同样由 ​​POSIX 定义的 C 标准库函数。)

鉴于这一切,为什么 POSIX 没有标准化一个mktemp命令,保证它的存在和至少它行为的某些方面?这是 POSIX 委员会的一个明显疏忽,还是委员会mktemp实际上已经讨论了标准化的想法并因某些技术或其他原因被拒绝?

shell-script posix mktemp

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

cat STDIN 不会在脚本中工作两次

我有一个脚本可以输出各种信息和 html 表单的文本字段(方法 POST)。当我尝试 cat <&0 时,它显示正确。然而几行之后,我再次尝试 cat <&0 并且没有打印任何内容。我究竟做错了什么?

....
cat <&0
echo Content length is $CONTENT_LENGTH
cat <&0 | sed -e 's/&/\n/g' | cut -d'=' -f2

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

shell bash shell-script stdin

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