当远程计算机的 .bashrc 包含 source 命令时运行 scp

当远程计算机的 .bashrc 包含 source 命令时运行 scp

当远程计算机 .bashrc 文件包含时,我无法通过 scp 复制文件来源命令更新路径和一些变量。为什么会发生这种情况?

答案1

您应该将您的部分或全部.bashrc 不是当您的 shell 非交互式时运行。 (Anscp是非交互式 shell 调用的一个示例,除非有人从根本上改变了您的系统。)然后将所有可能生成输出的命令放入文件的该部分中。

在 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

这个解决方案对我来说也有效。但由于我的默认 shell 是 TCSH,所以我必须稍微修改修复程序,如下所示(在 .tcshrc 中):

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

只是想我会为了大家的利益而分享。

相关内容