#!/bin/bash
#
echo $PWD
cd /home/<my username>/<long path>
echo $PWD
执行它时我得到什么bash script.sh
:
/home/<my username>
: No such file or directorye/<my username>/<long path>
/home/<my username>
或者与bash . script.sh
.: .: is a directory
看起来在第一种情况下它/hom
无缘无故地跳过了地址行的前 4 个字符 ( )。在第二种情况下,到底是什么.: .:
?这绝对是“不可谷歌的”。
当我cd /home/<my username>/<long path>
在终端中复制粘贴这一行时,ofc 会像它应该的那样工作。
编辑:这都是关于路径末端缺少一个空格符号的,谢谢。
答案1
你应该
检查脚本中“/home”部分之前是否有任何“隐藏字符”(这将解释它无法 cd 到它,以及为什么显示也会截断其中的一部分)。例如: cat -ve THEFILE #
-e
将用一个标记线的每一端$
和-v
将在表单中显示一些控制字符^x
, 前任:^M
控制字符“回车”。修复它:为此,请在 shell 中键入一个工作示例,然后使用鼠标复制它,编辑脚本,删除该行,然后将复制的内容粘贴到其位置。 (在 vi 中:如果脚本与描述完全一致(并且错误行是第 4 行):您可以使用以下命令转到第 4 行
4G
,然后删除该行dd
,然后在上面的行中进入插入模式:O
(大写 o)。然后你可以粘贴用鼠标复制的行。然后Escape
返回命令模式,并且:wq
将更改写入文件并退出 vi。您可能想要将输出 $(pwd) 与值 $PWD 进行比较:尝试替换:
echo $PWD
和 :pwd ; echo "PWD=$PWD"
最后 :
bash . script.sh
应该:bash ./script.sh
。您输入的命令要求 bash 执行“.”。带有参数“script.sh”和“.”作为一个目录,bash 抱怨道。当以这种方式调用时,投诉通常采用以下形式:program_name: some message
。这里 bash 尝试执行程序.
,所以它的错误信息被错误地用作.:
程序名提示,并且显示的消息是.: is a directory
,表明它无法执行它以及原因(它是一个目录,而不是 bash 脚本)。请注意,当您以这种方式调用 script.sh 时 (bash ./script.sh),您会要求当前 shell 调用
bash
将执行script.sh
并退出的子 shell。只有 bash 子 shell 会是:回显 PWD,然后 cd 到目录,回显新的 PWD。当 bash 退出时,当前的 shell 仍位于原始目录中。如果你想让一个文件在你当前的 shell 中进行更改,请改为使用它:. ./script.sh
或者在 bash 中你也可以source ./script.sh
(注意:.
这是获取文件的更便携的方式)(注意 2:有一个文件的源路径是在最近的shell中推荐,ie:. script.sh
也可以,但建议指定本地路径如. ./script.sh
:)
答案2
你的第二个问题很简单:
.: .: is a directory
当您运行 Bash 脚本并且 Bash 遇到错误时,它会打印脚本的名称以及发现错误的行,如下所示:
script.sh: line X: some message
命令行bash . something.sh
尝试作为脚本运行.
,因此失败。也许您正在寻找bash ./script.sh
?在这种情况下,您不需要指定完整路径。只要你这样做,Bash 就可以找到该脚本bash script.sh
。
你的脚本的输出有点奇怪:
: No such file or directorye/<my username>/<long path>
它缺少文件信息和部分错误消息。
我猜你的脚本有一些意想不到的不可打印的字符。如果这是用使用 CR-LF 行终止符的编辑器编写的,则可以使用fromdos -b script.sh
.该-b
标志确保fromdos
会留下原始文件的备份。如果您使用的是 Debian,则可以使用软件包安装此程序tofrodos
。
要验证是否有意外的不可打印字符,请使用cat -A
。可能会出现一些有趣的事情。例如,制表符将打印为^I
,换行符将打印为$
。如果您的文件确实有 MS-DOS 样式的换行符,它们将显示为^M$
.
答案3
您可以执行以下命令并再次运行它吗?
dos2unix脚本.sh
如果仍然不起作用,请使用以下命令从文件中删除不可打印的字母
tr -cd "[:print:]" script.sh > script2.sh bash script2.sh