プログラミング
迷子の「j」が私の夜を台無しにした
A stray "j" ruined my evening (napkins.mtmn.name)
要約
筆者は、自作のリンク短縮スクリプト「shirts linkener」を数ヶ月間問題なく使用していました。しかし、ある日、共有したS3ホストの画像リンクが友人たちから404エラーになると報告されました。原因を調査したところ、`wl-copy`でクリップボードにコピーされたリンクの末尾に改行文字`\n`が含まれており、これが特定の端末環境で「j」として表示され、URLが破損していたことが判明しました。`jq`コマンドの`--join-output`または`-j`オプションを使用することで、この問題は解決されました。
全文翻訳
← 戻る 2026-06-08
少し前、私はシャツリンケナーと呼ぶ、おかしなリンク短縮ツールを何とかすることにしました。短い名前はシャツです。
特に特別なことはありませんが、生成されたリンクをwl-clipboardを使ってクリップボードにコピーする、一度実行したら忘れるタイプのシェルスクリプトに組み込んでいます。
#!/bin/sh
shirt=$(curl -s -X POST "$(pass show shirts/url)" \
-H "Authorization: Bearer $(pass show shirts)" \
-H "Content-Type: application/json" \
-d "{\"url\": \"${1?missing url}\"}")
echo "$shirt" | jq
echo "$shirt" | jq -r '.short_url' | wl-copy
ここには特に変わったことはありません。リンクを短縮してクリップボードにコピーします。それから数ヶ月間、私は問題なく楽しく使っていました。
面白くなってきたのは、Rustで書かれたSignal TUIであるgurkを試してみることにしたときです。私を知っている人なら、私がターミナルインターフェースに夢中なのを知っているので、これは当然の組み合わせでした。
ある晩、S3にホストされている画像へのリンクを共有していたとき、人々から404が表示されると言われました。
リンクをFirefoxに貼り付けてみると、機能しました。どうなっているのでしょうか?彼らにリンクを送ると、今度は機能します...
時間が経ち、複数の友人から同じ応答(404)が届きます。しばらくメッセージを見ていると、あるパターンに気づきました。すべてのURLが「j」で終わっています。
結局、私はリンクを末尾に\n(改行文字)を付けてコピーしていました。ほとんどの場合、これは気づかれなかったのですが、ANSIの改行区切り文字では「j」と翻訳されるため、すべてのリンクの最後に迷子の「j」が付いていたのです。
途方もない恥ずかしさに5分間浸った後、jqに`--join-output`引数があることを発見しました。これはまさに私のケースを防ぐものです。
`--join-output / -j`: `-r`に似ていますが、jqは各出力の後に改行を出力しません。
この話の教訓は、ターミナルは楽しいということ、そして繰り返し自分で足を撃つことが素晴らしい学習の機会になるということです。
制御コードとエスケープシーケンスに関するいくつかの情報源。
https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
https://cirw.in/blog/bracketed-paste
https://jdhao.github.io/2021/02/01/bracketed_paste_modem.