Xshell中运行sh脚本的完整步骤:指定解释器与权限设置
Xshell6是一个强大的安全终端模拟软件。 Xshell6支持SSH1,SSH2和TELNET 协议。用户可以通过家里的网络连接远程主机,方便用户在家处理突发事情,可以让用户轻松管理远程主机。 Xshell6还可以上传下载文件,非常方便。
新手常误以为Xshell能直接运行本地sh文件,实则需通过SSH在Linux远端执行。本文演示如何在Xshell连接的Linux终端中创建脚本、使用sh或bash命令执行、chmod添加权限直接运行,以及查看退出状态和解决CRLF格式错误。
在 Xshell 里运行 .sh 文件,本质是通过 SSH 连接到 Linux 服务器,让远端的 Shell 解释器读取并执行脚本。Xshell 只是终端模拟器,它不负责存储或解释 Linux 脚本;把 Windows 里的文件路径直接粘贴进 Xshell 窗口,通常只会得到“找不到命令”的报错。要实现脚本执行,必须确保脚本已存在于远端 Linux 系统中,且当前账号拥有相应的读取或执行权限。
下面以已获授权的 Linux 账号为例,在用户主目录下创建一个简单的练习目录和脚本。整个过程不涉及系统级配置修改,重点在于理清“谁在执行”以及“如何正确调用”。

Xshell 会话窗口显示已登录 Linux 主机,终端中执行 pwd 和 whoami 命令确认环境
1. 确认进入的是远端 Linux 终端
打开 Xshell 并登录到目标 Linux 主机。首先要区分当前是在 Xshell 的本地命令提示符下,还是已经进入了远端服务器的 Shell 环境。只有在远端环境中,执行的命令才会作用于 Linux 系统。
输入以下命令确认当前身份和位置:
pwd
whoami
pwd 显示当前工作目录,whoami 显示当前登录用户名。如果输出的是 Windows 路径或提示未连接,请先建立 SSH 会话。确认连接成功后,创建一个专用的练习目录并进入:
mkdir -p ~/xshell-demo
cd ~/xshell-demo
若切换目录失败,请检查权限或目录名拼写,不要在不明确的位置继续操作。

1. 确认进入的是远端 Linux 终端
2. 创建一个内容明确的练习脚本
在练习目录中,我们创建一个名为 hello.sh 的简单脚本。使用 cat 命令配合重定向可以快速生成文件,避免使用图形化编辑器上传的繁琐过程。注意,这会覆盖同名文件,请勿对重要业务脚本使用此方法。
输入以下内容并回车:
cat > hello.sh <<'EOF'
#!/bin/sh
printf '%s\n' 'Hello from shell'
EOF
创建完成后,建议查看文件内容和权限,确保首行的解释器声明(Shebang)和打印语句完整无误:
ls -l hello.sh
cat hello.sh

终端中使用 cat 重定向创建脚本,并通过 ls 和 cat 验证文件内容
脚本的 .sh 后缀仅是命名习惯,Linux 系统真正识别的是文件内容中的解释器声明以及文件本身的执行权限。如果是从 Windows 上传的脚本,务必在此时检查内容是否因换行符差异出现异常。
3. 先用指定解释器执行
最稳妥的执行方式是显式指定解释器。本例脚本兼容 POSIX sh 语法,可以直接调用 sh 来运行:
sh ./hello.sh
这种方式由 sh 程序读取文件内容并执行,因此不要求 hello.sh 本身具有可执行权限(x 权限),只要当前用户有读取该文件的权限即可。屏幕应输出一行 “Hello from shell”。
如果脚本使用的是 Bash 特有语法(如数组、高级字符串处理),则应使用 bash ./hello.sh。切勿因为文件后缀是 .sh 就盲目使用 sh,也不要指望首行的 #!/bin/sh 在你显式调用其他解释器时自动生效——显式调用的优先级更高。
4. 需要直接运行时添加执行权限
若希望像运行系统命令一样直接通过文件名启动脚本,需要先赋予其执行权限。使用 chmod 命令为文件所有者添加执行位:
chmod u+x ./hello.sh
./hello.sh

使用 chmod u+x 赋予执行权限后,通过 ./hello.sh 直接运行脚本
此时,内核会读取脚本首行的 #!/bin/sh,并调用对应的解释器执行。注意路径前的 ./,它表示当前目录。Linux 默认不会在当前目录查找可执行文件,若只输入 hello.sh,系统通常会报“command not found”,除非当前目录已被加入 $PATH 环境变量。
遇到权限拒绝错误时,仅针对当前脚本添加用户执行权限即可,无需改为 777 或使用 sudo,除非脚本确实需要 root 权限才能完成其内部操作。
5. 记录退出状态,区分执行与环境修改
脚本执行完毕后,可以通过查看特殊变量 $? 来获取上一条命令的退出状态:
printf 'exit status: %s\n' "$?"

执行 printf 命令查看 $? 变量,确认脚本退出状态为 0
通常 0 表示成功,非 0 值表示某种错误。请注意,必须在执行脚本后立即查看,中间插入的其他命令会覆盖 $? 的值。
另外,脚本在子 Shell 中运行,其中的 cd 命令不会改变当前 Xshell 终端的工作目录。若需让脚本中的环境变量变更影响当前会话,才考虑使用 source ./hello.sh 或 . ./hello.sh,但这要求脚本内容完全可信,否则会污染当前 Shell 环境。
如果在执行从 Windows 上传的脚本时出现类似 /bin/sh^M: bad interpreter 的错误,说明文件包含 CRLF 换行符。需在编辑器中将换行符转换为 LF(Unix 格式)后重新上传,或在 Linux 中使用 dos2unix 工具处理,切勿通过删除内容来规避格式问题。
保留好经过验证的脚本文件和执行记录。日常运维中,先确认远端路径,再根据脚本需求选择显式调用解释器或直接执行,最后核对退出状态,是确保脚本稳定运行的标准流程。

































