可能重复:
Code won’t run. [not]
我已经编写并编译了一个程序,我想这样做,以便从shell我可以只输入programname使其运行而不是进入程序所在的目录并在程序名称前输入./。如果可以,请告诉我。
答案 0 :(得分:16)
如果你和我一起去Alderaan,你必须学习PATH的方法。
答案 1 :(得分:5)
你应该add the directory编译程序所在的路径。
例如,如果您在/home/jimmy/cpp
目录
键入(前导$是提示)
PATH=$PATH:`pwd`
$myprog
了解export变量和bashrc file以使此更改成为永久变更。 (假设bash为你的shell)
答案 2 :(得分:4)
详细讨论为什么将.
(当前目录)放在PATH
中是个不错的主意。
让我们说你被机器上的对手攻击了。
他创作了一个恶意程序,并把它放在一个目录中,希望你最终会偶然发现它。为了增加他的机会,他将其命名为常见的mv
。
如果您已将.
添加到路径的开头,并且当您键入mv onefile twofile
时恰好位于正确的目录中...那么本地mv
({{1运行而不是./mv
命令,我们都使用了!这是因为mv
位于您的路径中,而.
位于mv
之前。突然之间,您的用户帐户或整台计算机可能会受到严重破坏。
(注意:mv可能是内置命令之一,并且对此免疫。不确定......但原理是可靠的)
所以,你学习了这一课,现在把/usr/bin/mv
放在路径的尽头,这样就可以在本地目录之前搜索所有“官方”目录。
但攻击者现在对你了!而不是程序.
,他在程序mv
中创建,这是mc
的常见错字。同样,您打算键入mv
,但要对mv onefile twofile
做一个简单的拼写错误。现在搜索了所有“官方”目录,找不到程序mc
,最后在本地目录中找到它。恶意代码会运行,您又会丢失。
教训是你的mc
应该只涵盖已知良好的软件,并且由于你当前的目录经常更改,你永远不知道那里有什么软件,除非你非常清楚,否则不应该运行它。它带有PATH
前缀(例如> ./IMeanToRunThis)
答案 3 :(得分:2)
就个人而言,我使用$HOME/bin
作为我编写的实用程序的个人收集点,但这对所有用户都没有用。否则,/usr/local/bin
通常是本地编写的程序的正确位置, 对所有用户都有用。无论如何,我已经确认后一个地方在我的路径上并且还添加了$HOME/bin
。
除非你真的是安装程序,否则尽管有诱惑,将程序放到/bin
或/usr/bin
可能不是一个好主意。这相当于将您的计划放在C:\Windows
或C:\Windows\System32
中。它实际上永远不是正确答案。
了解有关PATH环境变量的更多信息以及shell如何搜索要运行的程序,绝对值得推荐。另外,正如另一条评论所指出的那样,只是不要将.
添加到你的PATH中,因为它会在某些时候回来困扰你。
编辑:顺便说一下,我在Windows boxen上做了类似的事情。我总是为名为C:\Program Files
的{{1}}创建一个兄弟姐妹。在那里,我创建了一个名为C:\Programs
的文件夹,并将其添加到系统路径中。我使用bin
就像我在* nix框上使用C:\programs\bin
一样,并且放置任何手动安装(即没有使用真正的 Windows安装程序)程序或从*移植的东西在其他文件夹(例如$HOME/bin
,C:\Programs\mingw
或C:\programs\MSYS
中无法容忍其路径中的空格的nix。
主要在命令提示符下使用的任何小实用程序通常最终都在C:\programs\cygwin
,但对于我认真计划在多台PC上使用的任何内容,我通常使用InnoSetup创建一个真正的Windows安装程序并让它安装在C:\programs\bin
。
答案 4 :(得分:2)