リモートコンピュータの.bashrcにソースコマンドが含まれている場合は、scpを実行してください。

リモートコンピュータの.bashrcにソースコマンドが含まれている場合は、scpを実行してください。

リモートシステムの.bashrcファイルに次のものが含まれていると、scpを介してファイルをコピーできません。源泉このコマンドはパスといくつかの変数を更新します。なぜこれが起こるのですか?

答え1

あなたの内容の一部または全部を含める必要があります。.bashrc いいえシェルが非対話型の場合に実行します。 (Anは、scp誰かがシステムを根本的に変更しない限り、非対話型シェル呼び出しの例です。)次に、出力を生成できるすべてのコマンドをファイルの適切なセクションに入れます。

initファイルでこれを行う標準的な方法は次のとおりです。

# Put all the commands here that should run regardless of whether
# this is an interactive or non-interactive shell.

# Example command:
umask 0027

# test if the prompt var is not set and also to prevent failures
# when `$PS1` is unset and `set -u` is used 
if [ -z "${PS1:-}" ]; then
    # prompt var is not set, so this is *not* an interactive shell
    return
fi

# If we reach this line of code, then the prompt var is set, so
# this is an interactive shell.

# Put all the commands here that should run only if this is an
# interactive shell.

# Example command:
echo "Welcome, ${USER}.  This is the ~/.bashrc file."

使用している人も見ることができます。

[ -z "${PS1:-}" ] && return

私のより長い声明よりif

ファイル全体を並べ替えたくない場合は、次のように特定の行をラップして対話型コンテキストでのみ実行できます。

if [ -n "${PS1:-}" ]; then
    echo "This line only runs in interactive mode."
fi

このように分離すると、.bashrcコマンドscpでこの問題は発生しなくなります。

答え2

このソリューションは私にとっても効果的です。しかし、私のデフォルトのシェルはTCSHなので、次のように修正を少し変更する必要がありました(.tcshrc)。

if ( $?SSH_TTY ) then
    exec /bin/bash
endif

皆の利益のために共有しなければならないと思いました。

関連情報