我正在使用curl --cookie-jar <filename>
来保存Cookie temperley并稍后在脚本中加载它。
在OS X中,没有/ dev / shm,我不希望有太多临时文件写入SSD。
是否可以使用变量而不是文件来让这个/任何命令写入?
变量可以像curl --cookie <(echo "$variable")
的文件一样读取,是否涉及磁盘访问?
答案 0 :(得分:3)
在完全一般意义上:你不能。 Shell变量不会在文件系统上独立存在,只不过是Python变量或C程序&#39;变量呢。 ( Environment 变量暴露给进程读取,但更改不会传播回父进程,因此即使操作系统具有扩展,提供可通过文件系统接口访问的环境变量 - 类似于Linux上的/proc/self/environ
- 在这里没有帮助,需要进行双向通信。)
您可以使用hdiutil
和diskutil
创建一个包含文件系统的ramdisk,其作用与/dev/shm
相同。见ie。 https://gist.github.com/rxin/5085564
一种非常可行但可行的方法是使用后台进程在一对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状态可能会挂起。