将stderr重定向到stdout

时间:2017-06-25 19:39:15

标签: bash macos unix curl

我正在使用curl 7.54.1(x86_64-apple-darwin15.6.0)从bash脚本中的soundcloud API下载曲目

代码看起来像这样 -

# -vsLOJ = --verbose --silent --location --remote-name --remote-header-name
# redirect stderr to stdout to capture the headers
curl_output=$(curl -vsLOJ $track_download_url?client_id=$client_id 2>&1);

这应该是:

  1. 详细打印请求/响应(以捕获HTTP标头)
  2. 使下载栏无声
  3. 按照位置(API提供了一个漂亮的链接302到实际文件)
  4. 使用“Content-Disposition”标题创建文件作为文件名(这将成为输出文件,而不是stdout
  5. 将stderr(发送详细输出的位置)重定向到stdout
  6. 发生了什么: 下载没问题,它使用“Content-Disposition”中的正确名称将文件保存到工作目录,但 $curl_output充满了看起来像是{的混合的垃圾数据{1}}工作目录和部分详细数据。

    示例输出cURL-ing ls在带有文件的测试目录中:

    https://www.google.com
      

    fakefile.1 fakefile.2 hello.txt song.mp3 vacation.png重建网址:   https://www.google.com/ fakefile.1 fakefile.2 hello.txt song.mp3   vacation.png尝试172.217.10.100 ... fakefile.1 fakefile.2 hello.txt   song.mp3 vacation.png TCP_NODELAY设置fakefile.1 fakefile.2 hello.txt   song.mp3 vacation.png连接到www.google.com(172.217.10.100)   端口443(#0)fakefile.1 fakefile.2 hello.txt song.mp3 vacation.png   使用TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256进行TLS 1.2连接   fakefile.1 fakefile.2 hello.txt song.mp3 vacation.png服务器   证书:www.google.com fakefile.1 fakefile.2 hello.txt song.mp3   vacation.png服务器证书:Google Internet Authority G2   fakefile.1 fakefile.2 hello.txt song.mp3 vacation.png服务器   证书:GeoTrust Gl<设置Cookie:   绝密=绝密############################################### ######################### 100.0%*连接#0以托管www.google.com完好无损

    完全让我困惑。我已经在bash脚本和终端中测试了这个。它只是在我将结果存储在变量中时才会发生,运行该cURL(包括stderr重定向)而不将其存储在$ curl_output中将正确写入

    而且,对于我用

    测试的任何网址都会发生这种情况

    我的.curlrc:

    curl_output=$(curl --verbose -o /dev/null "https://www.google.com" 2>&1)
    echo $curl_output
    

1 个答案:

答案 0 :(得分:0)

$curl_output变量周围加上引号,因为它包含*的解释。

% echo "$curl_output"
* Rebuilt URL to: https://www.google.com/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 2a00:1450:4009:806::2004...
* Connected to www.google.com (2a00:1450:4009:806::2004) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

鉴于:

echo $curl_output

会将*解析为当前目录中的任何文件名。