Panda Noir

JavaScript の限界を究めるブログでした。最近は幅広めに書いてます。

scpしたときに「open terminal failed」と出る問題に対応する

どうもこんにちは。皆さんお元気ですか?僕はAdvent Calendarのネタが切れたり、飲み会で飲みすぎて開始1時間後からの記憶が全部吹き飛んだり色々と大変な今日この頃です。

さて今回のテーマはscpコマンドが「open termianl failed」と出てきたときの対処法についてです。

どういう環境で起きたのか

scpコマンドで接続する先がfishをデフォルトシェルとしていて、起動すると同時にtmuxを走らせるという設定にしていました。どうやらtmuxを走らせるのが良くなかったようです。というのも、scpしている最中にechoコマンドを実行すると、scpが標準入力を使っている関係でおかしくなってしまうようです。

解決方法

fishがインタラクティブでない(=scpでアクセスされている)ときにtmuxが走らないようにすれば解決できます。

fishにてインタラクティブかどうかは次のようにして判定します。

参照: How can I check if a shell is login/interactive/batch in fish? - Unix & Linux Stack Exchange

if status --is-interactive
    echo "interactive"
else
    echo "not interactive"
end

他のbashやzshでは次のようにして判定できます。

if [ -n "$PS1" ]; then
    echo "interactive"
else
    echo "not interactive"
fi

あとはインタラクティブでないときにexitするように設定ファイルの先頭に記述すればOKです。

status --is-interactive; or exit

どうでもいいですが、こういう細かいところまで他のシェルと異なる書き方を強要されると、fishの方が可読性が高いとはいえさすがにストレスですね・・・