コマンドラインで4096文字を超えるテキストのコピー&ペースト(リダイレクトで保存)をしたい
解決したいこと
コマンドラインで4096文字を超えるテキストのコピー&ペーストをしたいです。
発生している問題・エラー
問題は4096文字を超えた分のテキストがペーストされず、切り捨てられてしまう点です。
特にエラーが発生したりはしません。むしろエラーとして検出できず、データ落ちに気づけないもしくは気づくのが遅れる点が問題といえます。
該当するソースコード
再現手順
(1) Webブラウザで1万文字以上のテキスト(JSONデータ)をコピー (Ctrl+C)
(2) Linux のターミナル(端末アプリ)上で、下記コマンドを実行しておく
$ cat > data.json
(3) 端末上にペースト (Ctrl+Shift+V) し、Ctrl+D (EOF) で終了
(4) 画面上にはペーストしたデータが最後までスクロール表示されます
(5) しかし、data.json
ファイルには4096文字までしか保存されていません
$ wc data.jso
1 1 4096 data.json
上記(2)から、クリップボード上にはデータはあると判断できます。端末アプリが切り捨てているのかなとも思いましたが、画面上には表示されているので判断できかねています。
なお、(2)のあと echo $?
してみると exit code は 0 で正常終了しています。
環境
- Ubuntu Linux 20.04.5 Desktop LTS 日本語 Remix
- 同梱の「端末」アプリ
- GUI上でヘルプ等みても実体がわからないのですが、
gnome-terminal
コマンドを実行すると起動するので、これだと思います。
- GUI上でヘルプ等みても実体がわからないのですが、
$ gnome-terminal --version
# GNOME Terminal 3.36.2 using VTE 0.60.3 +BIDI +GNUTLS +ICU +SYSTEMD
- cat コマンド
$ cat --version
cat (GNU coreutils) 8.30
自分で試したこと
代替策と質問の動機
代替策として、viエディタを開いて新規ファイルにコピー&ペーストすれば保存することはできましたので、ものすごく困っているわけではないのですが、なぜ4096文字を超えた分が切り捨てられるのか、純粋に疑問が湧いたので質問させていただきました。
問題切り分けのためにやったこと
以下では、この期待通り保存できたファイルを expected.json
としています。
cat のファイルI/O, 標準入出力リダイレクトに制限があるかどうか
次のようにファイルのオープンと標準出力へのリダイレクトはできました。
$ cat expected.json > hoge
$ wc hoge
2 1 80982 hoge
標準入力のバッファーに制限があるのかなと思い、下記のようなパイプ入力も試しましたが、問題が再現しませんでした。
$ cat < expected.json > hoge
$ cat expected.json | cat > fuga
$ wc hoge fuga
2 1 80982 hoge
2 1 80982 fuga
4 2 161964 合計
cat 以外のコマンドの場合
cat
以外にも
$ sed -e 's/,/, /g' >hoge
$ grep '[[:alnum:]]' >fuga
といったコマンドを試しましたが、結果はcat
と似たような感じで、入力データが大量に切り捨てられました。
$ wc hoge fuga
0 211 4305 hoge
1 1 4096 fuga
1 212 8401 合計
ただ、sed
の結果からも分かるとおり、出力の文字数は増えていることから、そもそも入力データが来てないような気がしています。
端末アプリ
Desktopの「端末」アプリがバッファーで切り捨てているのかなとも思ったのですが、man gnome-terminal
やネット検索してもバッファー関連の情報は見つからず、行き詰まってしまいました。
改行ありの場合
試しにテキスト置換で改行を挿入したデータに加工して同様のコピペを試してみました。
$ cat expected.json |sed -e 's/{/{\n/g' -e 's/}/}\n/g' >foo.json
$ wc foo.json
1444 1442 82424 foo.json
このfoo.jsonをWebブラウザで開いて、改めて「端末」へコピー&ペーストすると、期待通りペースト&保存されました。
$ cat > bar.json
$ wc foo.json bar.json
1444 1442 82424 foo.json
1443 1442 82423 bar.json
まとめ
改行がない4096文字超のテキストデータをgnome-terminalへコピー&ペーストできるようにするための方法、もしくはこれが可能な他のターミナルアプリがあれば教えていただきたいです。
また、こういった制限が加えられている一般的な理由などご存知の方がおられましたら教えていただきたいです。
よろしくお願いいたします。