【问题标题】:Shell script path won't work but will work on shell line [duplicate]Shell脚本路径不起作用,但可以在Shell行上工作[重复]
【发布时间】:2016-05-26 01:05:23
【问题描述】:

所以我要访问的脚本和文件都直接在同一个(root)中。我可以的

cat flist

它打印出来很好。但是,如果我在脚本(或任何其他文件)中调用“cat flist”,它将不起作用。它们都在根中。任何想法如何解决这个问题?

还有,

grep -w "asd" doc.data
sort -k2,2n doc.data
head -5 doc.data

这会打印 3 个不同的报告。我希望它首先使用 asd 一词获取所有内容,然后排序,打印前 5 个。我将如何更改它来完成此操作?

【问题讨论】:

  • 你在使用令人讨厌的 Windows 风格的 CRLF 行字节序吗?如果是这样,请修复它。
  • 如何检查这个?我在 Windows 上通过 SSH 连接到 linux 服务器
  • file yourscriptname
  • 文件 hw01.script1 hw01.script1:命令文本
  • 嗯,也许你有不同版本的file。试试:xxd yourscriptname

标签: bash shell


【解决方案1】:

运行脚本的用户可能没有根目录(即“/”)作为其 $PATH 的一部分。这意味着,为了引用根目录中的文件,您必须为其提供绝对路径名。在根目录的情况下,这只是意味着在斜线前面加上,所以'scriptname'就变成了'/scriptname'

值得注意的是,大多数 Linux 帐户的默认设置并不像 Windows 那样在路径中包含当前目录。这意味着必须使用绝对路径从另一个脚本执行脚本——即使它们都在同一个地方。 (出于安全原因,这被认为是一件好事,或者我可以理解。)

如果我误解了这个问题,我很抱歉,但我希望这会有所帮助。

编辑:至于第二部分,以你想要的方式组合命令,嗯,这是我最喜欢的关于命令外壳的事情之一,它说明了基于 Linux 的外壳通常被认为更多的原因之一比 Windows 上通常可用的功能更全面。您可以使用所谓的 管道 将一个命令的输出发送到另一个命令的输入。为此,您将命令与竖线或竖线字符组合在一起 - '|'在这种情况下,请尝试:

grep -w "asd" doc.data | sort -k2,2n | head -5

命令sorthead 都是管道兼容的(就像大多数本机命令一样)。这意味着他们使用“标准输入”(STDIN)和“标准输出”(STDOUT)。默认情况下,STDOUT 打印到屏幕上。但这就是管道字符的作用——它将 STDOUT 发送到下一个命令的 STDIN。希望这是有道理的,并且是有用的。试一试!

【讨论】:

  • 啊,是的,谢谢修复它。对我的问题的第二部分有什么帮助吗?(不打印 3 个不同的东西)
  • 关于我的 Linux 与 Windows 的评论,我应该指出,虽然我所说的适用于最常见的 Windows shell cmd.exe,但还有另一个称为 Powershell,它似乎实现了一个类似于此的管道,但至少根据我的经验,它似乎更难使用。 (我认为它以数据结构的形式对输入和输出进行操作,而不仅仅是文本)。