如何使用变量而不是文件让任何命令写入?

时间:2017-08-08 15:09:43

标签: bash curl

我正在使用curl --cookie-jar <filename>来保存Cookie temperley并稍后在脚本中加载它。

在OS X中,没有/ dev / shm,我不希望有太多临时文件写入SSD。

是否可以使用变量而不是文件来让这个/任何命令写入?

变量可以像curl --cookie <(echo "$variable")的文件一样读取,是否涉及磁盘访问?

1 个答案:

答案 0 :(得分:3)

文字问题

在完全一般意义上:你不能。 Shell变量不会在文件系统上独立存在,只不过是Python变量或C程序&#39;变量呢。 ( Environment 变量暴露给进程读取,但更改不会传播回父进程,因此即使操作系统具有扩展,提供可通过文件系统接口访问的环境变量 - 类似于Linux上的/proc/self/environ - 在这里没有帮助,需要进行双向通信。)

MacOS解决方法

您可以使用hdiutildiskutil创建一个包含文件系统的ramdisk,其作用与/dev/shm相同。见ie。 https://gist.github.com/rxin/5085564

替代方法:FIFO滥用

一种非常可行但可行的方法是使用后台进程在一对FIFO之间抽取数据:

#!/usr/bin/env bash

# These are the only two operations that touch disk
mkfifo cookie-write.fifo || exit
mkfifo cookie-read.fifo  || exit

# Start a background process that pumps data from the read FIFO to the write FIFO
datapump() {
  while IFS= read -r -d '' content <cookie-write.fifo || [[ $content ]]; do
    printf '%s\0' "$content" >cookie-read.fifo
  done
}
datapump & datapump_pid=$!

# run an initial curl with cookies written to cookie-write.fifo
curl -c cookie-write.fifo http://example.com/login
cookies=$(<cookie-read.fifo)   # read cookies set by login process

# write back from the shell variable to the FIFO to allow read by another curl
printf '%s\0' "$cookies" >cookie-write.fifo
# read in in that new curl process, write back to the FIFO again
curl -b cookie-read.fifo -c cookie-write.fifo http://example.com/do-something
cookies=$(<cookie-read.fifo)  # read cookies as updated by do-something process

这种方法需要非常小心以避免死锁:请注意,协处理首先读取然后写入;如果这些操作中的任何一个都没有发生,那么它将无限期地挂起。 (因此,如果您的curl操作没有写任何cookie,则泵进程不会将模式从读取切换为写入,并且随后尝试读取cookie状态可能会挂起。