我是基于 Linux 的设备的新手...
我有需要使用命令 update-os 更新固件的设备
当我输入此命令时,它会提示我如何使用它......
Update-os [--dry-run] FILE | URL [-V ]
这是什么意思呢?请注意,我有两个要更新的文件...一个称为 os-update,另一个是 update.bin 文件...
如何使用这个命令呢?我尝试在包含 .bin 文件的同一目录中运行以下命令
Update-os update.bin
但它再次提示我使用该命令。然后我尝试:
Update-os update.bin | /home/test/
但它说/home/test/ permission denied
我尝试使用 sudo...
Sudo Update-os update.bin | /home/test/
但我得到同样的许可被拒绝......
任何帮助将不胜感激...问候,
答案1
如何阅读用法:
Update-os [--dry-run] FILE | URL [-V ]
第一个词是您尝试运行的可执行文件:Update-os
。
[--dry-run]
- 方括号表示“可选参数”,因此您可以添加或不添加此选项 - 您的选择。通常,“空运行”意味着可执行文件会告诉您它在运行期间应该做什么,而无需实际执行。建议在前几次运行中使用它,直到您确定它完全符合您的预期。
FILE | URL
-|
此处的条形符号表示“或”。您可以在命令行中指定文件或 url。可执行文件将使用该文件或 url 来完成工作。
请注意:|
在命令行中使用具有不同的含义 - 它将stdout
一个命令传输到stdin
另一个命令。当您Uodate-os update.bin | /home/test/
这样做时,意味着您希望屏幕上打印的所有内容Update-os
都由命令处理/home/test/
,但由于这是一个目录而不是命令 - 您会收到错误。
[-V ]
又是可选的。不太清楚它会做什么,但通常-v
或-V
选项告诉可执行文件,在工作期间打印其版本或详细说明。您必须自己在可执行文件的文档中找到这一点。或者只是运行它(--dry-run
最好)。
答案2
问题的标题是“理解linux命令”。
所以我想其他任何事情甚至你的例子都是离题的。
我自下而上教授 unix 命令,这与学校和通常的教学方式完全不同,根据我的经验,这对我的学生来说比传统方法效果更好。
那么我们开始吧:
您需要了解的第一件事是 aprogram
和 a之间的区别process
。
unix 上的区别非常简单:program
只是磁盘(文件系统)上的一个愚蠢的“死”文件,其中包含一些可以运行的代码(但它不处于运行状态)。program
很重要,但本身也毫无用处:它就像一具死去已久的动物的骨架。
活的动物确实也需要骨骼才能生存,但从骨骼中提取出来的骨骼本身只是一个死物。同样,aprogram
也是一个死物。程序堆积在磁盘上(就像尸体一样),这些程序基本上只是文件,仅存在于存储中。
现在,一个process
是计算机内存中任何程序的“活”实例。
即当你在unix上运行一个程序时,系统获取它的文件(一个骨架),process
在内存中的某个地方构造一个(“活的动物”)并将该骨架(程序)放入动物(进程)中。进程比进程“更多” program
,但如果没有内部进程,它就无法生存program
(它的肚子里有一个程序)。
因此,在“运行程序”命令结束时,您开始运行,因此“活着”,process
它根据program
放入其中的骨架(a)具有“形状”和“行为”。进程“存在”于内存中并存在于 CPU 上。
现在重要的问题是,例如,一个程序可以产生多少个进程?
答案有很多(实际上是无限的,或者更确切地说,有多少适合你的记忆)。
程序和运行它的进程之间实际上存在 1:N 映射。
有了这些信息,您可能已经比其他初学者了解得更多了。
现在,正如我们所看到的,进程不仅仅是它正在运行的程序。
进程已分配有 CPU。进程分配有内存以及许多其他计算机资源。
该进程还分配给它的另一件事称为argument vector
.
这是什么 ?
它是一个“有序的词袋”。有序意味着包中单词的顺序很重要。如果你懂编程,你可以把它想象成一个数组。
为什么我们需要它?
让我们回到系统创建进程的那一刻:系统至少需要知道程序的名称,从中构造新的进程。
用于构造进程的程序名称始终是argument vector
.
这对于许多简单的程序来说效果很好,但某些程序的目的要复杂得多:比如处理某些东西,将其从某种东西转换为其他东西,用它做一些事情,也许还返回一些结果。
除了命名要使用的程序文件之外,这正是 an 的argument vector
用途:它用于将执行任务所需的任意信息传递给生成进程。
中的单词数量没有限制argument vector
,但它们必须是不同的。这些单词(在 中argument vector
)按原样传递给进程。到目前为止,将argument vector
数组中的每个这样的元素简单地称为“一个单词”有点愚蠢。为了将它们与“正常”“文本”单词区分开来,我们将 then 称为更好的:arguments
。
参数的含义及其顺序只能通过正在“处理”的程序(即,将其转入该过程)来理解。因此,每个程序都是它自己的宇宙、自己的语言、自己的单词/参数,它可以理解。
然后,生成的过程会逐一读取单词argument vector
,并根据其内容开始工作 - 这又是由程序控制的。
通常,an 中的独立单词/参数arg. vector
表示文件或文件(或目录)的路径。
Shell 自动将输入行分割成空格字符边界上的向量单词:即。mv oldfile newfile
外壳线最终会被argument vector
切成["mv","oldfile","newfile"]
。
现在,正如我们所说,系统总是将第一个单词解释argument vector
为要“处理”的程序的路径 - 实例化。因此,在本示例中,要运行的程序是mv
.
因此,使用迄今为止我们掌握的所有信息,向量 of["mv","oldfile","newfile"]
大致翻译为:运行一个名为 的程序mv
并为其提供两个参数oldfile
和newfile
。
现在,正如我们已经说过的,每个参数的含义完全由mv
程序本身解释。
mv
所以在它的程序通常情况下动作与传递给它的参数(除了最后一个参数)同名的文件放入文件(如果它不存在)或目录(如果它已经存在),用作传入的最后一个单词argument vector
。
因此["mv","oldfile","newfile"]
基本上最终意味着“移动”(或更确切地说“重命名”)名为“oldfile”的文件到名为“newfile”的文件,或者“移动”名为“oldfile”的文件到名为“newfile”的目录(如果存在)。
再次重复,结果过程如何处理参数,完全取决于被调用的程序(即mv
程序)。
我们已经说过,通常习惯上(但不是必需的!!!),an 中的每个独立单词都arg. vector
表示一条路径。
但有时我们希望将其他信息传递给程序,而不仅仅是路径,例如稍微改变其行为。
经过几十年的使用,形成了一种非正式的共识,即以-
或--
字符开头的参数是修改进程行为的参数。
我们将每个这样的论证称为“论证” a flag
。再次强调,标志的含义完全取决于程序!
例如,程序mv
还接受一个参数,一个标志,named -v
,还有一个标志named --verbose
,这两者都使它做同样的事情:打印出有关它正在做什么的信息。
因此mv -v oldfile newfile
最终将被切入argument vector
并["mv","-v","oldfile","newfile"]
打印mv
出结果:
$ mv -v oldfile newfile
renamed 'oldfile' -> 'newfile'
并将“oldfile”重命名为“newfile”。
有些程序足够复杂,它们需要至少提供一个参数才能完成任何有用的工作。
你的程序就是这种情况。
因此,当在没有任何参数的情况下调用时,这样的程序不会不执行任何操作,而是至少会打印出一些提示,描述如何使用该程序。
经过几十年的使用,围绕这些提示演变出了一些“迷你语言”。
但请注意!
正如您已经发现的那样,这个小提示语言与 shell 语言无关。
如果任何提示行在最好的情况下是无效的 shell 行,在最坏的情况下,当按原样反馈到 shell 时,它会做一些完全错误的事情,可能会导致灾难性的损坏。
所以永远不要像你那样将提示线按原样返回到 shell 中!
[
提示行中的字符与 shell 行中的字符具有完全不同的含义[
。永远不要混淆两者!
同样,|
提示行上的含义与 shell 行上的含义完全不同!再次强调不要混淆两者!
正如 White Owl@ 已经说过的,按照传统,[]
括号内的任何参数都意味着该参数是可选的。
|
提示行中的意思是or
或者更确切地说是在多个可能的调用之间进行选择。
以或BIG LETTERS
等形式键入的参数意味着参数/单词将被解释为“对象”的给定“类”:即该单词将被理解为路径或互联网服务器的 URL。FILE
URL
程序如何确定哪个是哪个,完全取决于程序本身,但例如,通常,如果“文件”参数以 url 模式字符(即“https://”)开头,则程序会假定它是一个 URL 。
正如您现在已经注意到的那样,阅读(和编写(!))提示线可能是一种艺术(甚至是一种黑暗的艺术)。坦率地说,没有人知道你的程序到底会做什么。提示行就是这样:提示。
唯一确定的方法是阅读给定的程序文档。
这是解释程序如何真正工作的唯一权威来源(即使这并不总是成立 - 例如,文档中(!!)或程序中(!!!)可能存在错误)。
然而正如你所看到的,我们高级用户在生活中已经看到足够多的提示线,并且许多程序员在他们的生活中写了足够多的程序,我们可以粗略地假设,这个程序将做什么以及何时做。
从它的名称和自我报告的提示行,我们可以“猜测”这一点:
- 该程序将更新设备的操作系统:(
update-os
注意:unices 区分大小写,字母大小很重要!!!) - 该程序可以选择进行测试运行,假装更新设备并执行所有操作,就好像它正在更新设备一样 - 而无需实际执行真正的更新 - 这
[--dry-run]
通常意味着 - 该程序可以从本地文件 (
FILE
) 或直接从互联网下载更新 (URL
)来更新设备 - 该程序接受可选标志,称为
-V
- 这个标志的作用我们不知道,但根据经验:- 它将打印出程序版本:如
-V
=version
- 或者它会打印出有关其操作的更详细的输出:如
-V
=verbose
(但传统上verbose
更常见的是在标志下-v
) - 最后,实际上
-V
很容易意味着Voldemort
- 它将打印出程序版本:如
最后,只有程序的创建者真正知道它会做什么。有时甚至连他们也没有......
我希望,您现在了解了问题背后隐藏的所有重要内容,并且您意识到了自己的愚蠢错误!
就像你给你的贝壳喂了语无伦次、咕哝的废话一样,它在任何情况下都可能无法理解。
您还应该庆幸的是,提示行不包含任何“危险”的 shell 字符,并且不会损坏您的计算机。