どうもこんにちは。皆さんお元気ですか?僕は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の方が可読性が高いとはいえさすがにストレスですね・・・