当远程计算机 .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
只是想我会为了大家的利益而分享。