我怎样才能编写一个行为与“cd”一样的 Go 程序?
我尝试运行命令,但没有成功。
func main() {
cmd := exec.Command("cd", "/media/")
err := cmd.Run()
log.Printf("Command finished with error: %v", err)
}
最佳答案
How can I write a Go program that will behave as 'cd ' does?
这在 POSIX 系统上不可能(即使使用任何其他编程语言)。
因为每个 process ,包括父 shell 进程,有其自己的当前 working directory .因此 cd 必须是 shell builtin (调用由 shell 进程本身完成的 chdir(2) 系统调用),它不能由某些 executable 完成,因为 shell 会 fork 一个新进程来运行每个命令(使用一些可执行文件,即不是内置的)。
阅读一些好的 Unix 或 Linux 编程书籍,例如 ALP ,求解释。还有一本关于 Operating systems 的好书,例如 Operating systems: three easy pieces会向您解释为什么会这样(并且在类似 POSIX 或类 Unix 的系统中不可能是其他情况)。
您的密码是 forking (使用 cmd.Run)一个新进程,那个子进程仅正在更改其工作目录。另见 fork(2) & execve(2) & path_resolution(7) .
调用 chdir(2)在你的 Go 代码中使用系统调用,使用 os.Chdir .这只会影响您的进程(以及由 fork(2) 创建的所有 future 子进程,它们继承其父进程的工作目录),当然不会更改您的父进程(通常是您的 shell)的工作目录。
要获取当前进程的当前工作目录(使用getcwd(2) 系统调用),请使用os.Getwd。在你的 Go 代码中(参见 this )。
在 Linux 上,您可以使用 /proc/(详见 proc(5))查询其他进程的工作目录。例如,在您的 shell 中运行 ls -l/proc/$$/cwd。在 Go 代码中,您将使用 os.Readlink在像 /proc/1234/cwd 等路径上。当然你不能改变一些其他进程的工作目录(你唯一可以改变的工作目录是你自己的进程之一,使用 chdir(2) )
正如 David Budsworth 评论的那样,您可以采用一个奇怪的约定:1. 您的prog 程序在标准输出上写入一个有效的(并且适本地为shell 引用)目录路径,仅此而已。 2. 你总是使用带有 command substitution 的 prog 程序,类似于 cd $(prog args...) (它可能成为 shell function 或 alias 等的主体),然后是你的 shell(不是你的 prog) 将更改目录作为程序的输出。
关于go - 从 Go 更改父 shell 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984853/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc