【Linux】terminal和shell中cd命令不一样的问题
本帖最后由 jjjzw 于 2022-3-27 16:52 编辑这两天在Ubuntu下搭建饥荒(DST)服务器时遇到了一个问题:
服务器启动文件所在路径为:
~/.steam/steamapp/common/Don\'t\ Starve\ Together/bin
在~/路径下建立run.sh
#!/bin/bash
install_dir="/root/.steam/steamapp/common/Don\'t\ Starve\ Together"
cluster_name="Cluster_1"
dontstarve_dir="/root/.klei/DoNotStarveTogether"
function fail()
{
echo Error: "$@" >&2
exit 1
}
function check_for_file()
{
if [ ! -e "$1" ]; then
fail "Missing file: $1"
fi
}
check_for_file "$dontstarve_dir/$cluster_name/cluster.ini"
check_for_file "$dontstarve_dir/$cluster_name/cluster_token.txt"
check_for_file "$dontstarve_dir/$cluster_name/Master/server.ini"
check_for_file "$dontstarve_dir/$cluster_name/Caves/server.ini"
check_for_file "$install_dir/bin"
cd "$install_dir/bin" || fail
run_shared=(./dontstarve_dedicated_server_nullrenderer)
run_shared+=(-console)
run_shared+=(-cluster "$cluster_name")
run_shared+=(-monitor_parent_process $$)
run_shared+=(-shard)
"${run_shared[@]}" Caves | sed 's/^/Caves: /' &
"${run_shared[@]}" Master | sed 's/^/Master: /'
运行
sudo ./run.sh
后报错:无法找到目录/root/.steam/steamapp/common/Don\'t\ Starve\ Together/bin
这时在Terminal中直接运行
cd /root/.steam/steamapp/common/Don\'t\ Starve\ Together/bin
却可以成功进入目录
在网上搜索该问题,得到答案:
运行sh文件后产生一个子shell,执行shell脚本是在子shell上执行的,当shell脚本执行完退出子shell,所以看不到结果应当使用source *.sh
因此我改用
source run.sh
依然出现了同样的报错,并且强制断开了ssh连接{:301_973:}
多次尝试后依然失败,最后实在没办法只能将脚本放在bin目录下source,该问题依然没能解决
求问各位大佬这是什么原因导致的,应该怎么解决! 给你顶顶 export导出一下变量试试 cd "$install_dir/bin" || fail把引号去掉 无法找到目录/root/.steam/steamapp/common/Don\'t\ Starve\ Together/bin
不是已经提醒得很明白了,路径不对。
你看一下路径 蜀水一方 发表于 2022-3-26 21:56
export导出一下变量试试
感谢!终于解决了 tl;dr 发表于 2022-3-27 06:34
terminal和shell不一样吗?
一开始以为是两者不一样的问题,最终发现这个是变量引起的问题{:301_999:} (shell小白)简单又复现了这个问题:
shell/
├── shell2
│ └── shell3 shell
└── test.sh
test.sh
#!/bin/bash
pwd
dir="shell2/shell3\ shell"
pwd
cd "$dir"
出现了同样的问题:cd: ***没有那个文件或目录
修改后
test.sh
#!/bin/bash
pwd
dir=shell2/shell3\ shell
pwd
cd "$dir"
问题解决了(习惯性用python的思维去思考了,过于自由的变量让我踩了大坑{:301_999:})
页:
[1]