Techioz Blog

system() の出力リストをクリアするにはどうすればよいですか?

概要

system() の出力は一時ファイルに保存されると言われました。

コマンドを実行するとこのエラーが発生します。その原因は system() です。

let content_type = 'Content-Type: application/x-www-form-urlencoded'
let accept = 'Accept: application/json'
let url = g:languagetool_server_root . '/v2/check'
Calling shell to execute: "(curl -X POST --header "Content-Type: application/x-www-form-urlencoded" --header "Accept: application/json" -d "language='en-US'&enabledOnly=false&data='%7B%22annotations%22%3A
%5B%7B%22markup%22%3A%22%3Ch1%3E%22%7D%2C%7B%22text%22%3A%22Hello+world%21%22%7D%2C%7B%22markup%22%3A%22%3C%2Fh1%3E%22%7D%2C%7B%22markup%22%3A%22%3Cp%3E%22%7D%2C%7B%22text%22%3A%22Style+and+grammer+checke
r%22%7D%2C%7B%22markup%22%3A%22%3C%2Fp%3E%22%7D%5D%7D'"'http://localhost:8081/v2/check'")>/var/folders/yh/z3ydby_56qz7mltrddsv3lqw0000gn/T/vzsapcl/2 2>&1"
Error detected while processing function languagetool#CheckGrammar:
line   12:
E282: Cannot read from "/var/folders/yh/z3ydby_56qz7mltrddsv3lqw0000gn/T/vzsapcl/2"

エラーが示すパスが system() に追加されていることに今気づきました。それは奇妙だ。シェル コマンドを実行するコードは次のとおりです。

let content_type = 'Content-Type: application/x-www-form-urlencoded'
let accept = 'Accept: application/json'
let url = g:languagetool_server_root . '/v2/check'
let response = system('curl -X POST --header ' . shellescape(content_type) . ' --header ' . shellescape(accept) . ' -d language=' . shellescape(g:languagetool_default) . '&enabledOnly=false&data=' . shellescape(json) . shellescape(url))

これまでに :clear と histdel() を試しましたが、 histdel() は system() の出力の一時ファイルとは何の関係もないと言われました。

解決策

shellescape() は、変数の値を一重引用符で囲みます。出来た!私はcurlコマンドを再構築し、ヘッダーとボディ(渡すデータを含む)を変数に分離しました。それは引用符の問題でした。

これは機能したコードです:

let content_type = 'Content-Type: application/x-www-form-urlencoded'
let accept = 'Accept: application/json'
let data = 'language=' . g:languagetool_default . '&enabledOnly=false&data=' . json
let url = g:languagetool_server_root . '/v2/check'
let response = system('curl -s -X POST --header ' . shellescape(content_type) . ' --header ' . shellescape(accept) . ' -d ' . shellescape(data) . ' ' . shellescape(url))

ただし、なぜ存在しない一時ファイルが system() によってロードされたのかはまだわかりません。クライアント側のどこにも出力を保存しないため、これは間違いなくカールではありません。

話すのが早すぎました。再構築されたcurlコマンドでそれを再度実行しています。一時ファイルの問題の原因は引用符の問題ではなかったと思います。

悪いです。この質問とは関係ありません。