【问题标题】:Bash - what's the difference between reading a variable and directly assigning it?Bash - 读取变量和直接分配变量有什么区别?
【发布时间】:2019-02-28 00:16:45
【问题描述】:

只是出于好奇-以下有什么区别..

我有一个脚本,我正在从 KB 转换为 MB。我正在使用命令替换来分配变量,但只是没有看到分配它们的区别如下:

backup_size=$(echo "$client_kb/1024" | bc -l)

&

read backup_size < <(echo "$client_kb/1024" | bc -l)

每种做事方式的需求是什么?

谢谢

【问题讨论】:

  • 第二个涉及在文件系统中创建临时文件的磁盘开销
  • @Inian:是吗?在strace 下运行时我看不到任何内容。
  • @choroba: 可能是 FIFO 或 /dev/fd - linux.die.net/man/1/bash 下的文件
  • 是的,但是 /dev/fd 不会创建任何真实文件。
  • 这里,read 不是必需的,但是您可以使用 read 做一些简单的分配无法做到的事情,最突出的例子是分配给两个或多个名称一次:IFS=, read foo bar &lt; &lt;(echo "1,2")foo=1 bar=2 相同。

标签: bash variables scripting


【解决方案1】:

对于像数字这样的简单值,没有区别。但是尝试使用包含尾随空格或多行的值:

#! /bin/bash
func () {
    printf $'1  2\n3   '
}

command_substitution=$(func)
read process_substitution < <(func)

set -xv
[[ "$command_substitution" == "$process_substitution" ]]

【讨论】:

    【解决方案2】:

    除了@choroba 提到的。它还对错误处理有影响。考虑一个场景,您可以使用来自 sample_func 的输出,前提是它返回了成功的错误代码。

    sample_func() {
        echo "Hello world"
        return 1
    }
    
    command_substitution=$(sample_func)
    rc=$?
    echo "Error: $rc"
    echo "command_substitution: $command_substitution"
    
    echo '---'
    
    read process_substitution < <(sample_func)
    rc=$?
    echo "Error: $rc"
    echo "process_substitution: $process_substitution"
    

    输出:

    Error: 1
    command_substitution: Hello world
    ---
    Error: 0
    process_substitution: Hello world
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2011-11-12
      • 2021-01-27
      • 2021-10-27
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多