一个简单的小“cd”在脚本中不起作用

一个简单的小“cd”在脚本中不起作用
#!/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

相关内容