jjjzw 发表于 2022-3-26 20:41

【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,该问题依然没能解决

求问各位大佬这是什么原因导致的,应该怎么解决!

ywwlkj 发表于 2022-3-26 21:43

给你顶顶

蜀水一方 发表于 2022-3-26 21:56

export导出一下变量试试

Eaglecad 发表于 2022-3-26 23:45

cd "$install_dir/bin" || fail把引号去掉

tl;dr 发表于 2022-3-27 06:34

homehome 发表于 2022-3-27 08:59

无法找到目录/root/.steam/steamapp/common/Don\'t\ Starve\ Together/bin
不是已经提醒得很明白了,路径不对。

你看一下路径

jjjzw 发表于 2022-3-27 16:30

蜀水一方 发表于 2022-3-26 21:56
export导出一下变量试试

感谢!终于解决了

jjjzw 发表于 2022-3-27 16:32

tl;dr 发表于 2022-3-27 06:34
terminal和shell不一样吗?

一开始以为是两者不一样的问题,最终发现这个是变量引起的问题{:301_999:}

jjjzw 发表于 2022-3-27 16:50

(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]
查看完整版本: 【Linux】terminal和shell中cd命令不一样的问题