我已经编写了一个测试 ksh 文件,将其放入文件夹中并进行列表。写如下:
`cd "their_file/"`;
`pwd`;
`ls -l`;
给我以下输出:
./test.ksh: line 2: /home/user/final: Is a directory
./test.ksh: line 3: total: command not found
这是我的密码:
/home/用户/最终
我该如何解决?我猜它正在执行 cd 语句,然后退出该语句。我正在使用 Fedora 机器。
答案1
脚本中每个命令周围的反引号将导致 shell 获取命令的输出并执行那作为命令。
在命令周围使用反引号相当于将命令放入其中$( ... )
(这是捕获命令输出的首选语法)。
错误消息/home/user/final: Is a directory
来自ksh
尝试将 的结果pwd
作为命令执行,同样,也total: command not found
来自尝试执行 的结果ls -l
。
去掉反引号。同时删除分号 ( ;
)。仅当您想将两个命令放在同一行时才需要这些:
cd dir; pwd
你的脚本应该看起来像
#!/bin/sh
cd "their_file"
pwd
ls -l
请注意,如果失败pwd
,这仍然会执行。如果失败则退出脚本:ls -l
cd
cd
#!/bin/sh
cd "their_file" || exit 1
pwd
ls -l
cd
这利用了返回非零的事实退出状态如果失败了。||
(逻辑或者) 前面的表示如果返回“false” exit 1
,脚本将继续执行该语句(这在 shell 脚本中是非零退出状态的含义)。exit
cd
你得到的原因/home/user/final: Is a directory
和不是 /home/user/final/their_file: Is a directory
是因为是cd
在 a 中执行的子壳(当你把它放在反引号或里面时会发生这种情况$( ... )
)。由于它是在子 shell 中执行的,因此工作目录的实际更改不会反映在父 shell(您的脚本)中。
出于同样的原因,您会注意到,当脚本执行完毕后,您仍然位于调用脚本时所在的目录中,而不是位于 目录中their_file
。
有关此特定事物的更多信息,请参阅“为什么脚本中的 cd 功能不起作用“ 和 ”更改当前目录的脚本(cd、pwd)“(以及其他类似的问题)。