2017-05-10 71 views
1

我想使用一个命令在我的终端的三个新终端上打开三个不同的文件夹。它们都应该彼此独立运行,这意味着一个命令不依赖于前一个命令。调用多个Bash别名

这里是我的.bash_aliases,这是从.bashrc中

alias cmd1=gnome-terminal && cd ~/Desktop/ 

alias cmd2=gnome-terminal && cd ~/Documents/ 

alias cmd3=gnome-terminal && cd ~/Music/ 

alias runcmds='cmd1 & cmd2 & cmd3' 

称为但是,这开辟了三个终端的音乐目录,不正确地执行命令。我怎样才能让runcmds将所有3个命令分开运行?

此外,何时需要使用引号,何时不需要?

+0

...嗯。 'gnome-terminal && cd〜/ Desktop'不会运行新终端里面的'cd' *,这正是我想象的你想要的。相反,它运行一个新的终端,并在独立的,启动终端的外部进程中执行'cd' - 一个完全不同的shell。 –

+1

至于你什么时候做,不需要引号 - '别名cmd1 = gnome-terminal && cd〜/ Desktop'首先让'cmd1'成为'gnome-terminal'的别名,然后把目录改成'〜〜/Desktop“,其中定义了该别名。相比之下,当别名被调用时,别名cmd1 ='gnome-terminal && cd〜/ Desktop'会将'cd'转换为'〜/ Desktop',而不是定义它。 –

+1

理解[Bash中的引号是如何工作的](http://mywiki.wooledge.org/Quotes)对于您作为shell程序员的成功至关重要。如果您不确定何时使用它们,则可以在线获取大量资源。 – dimo414

回答

5

你的操作顺序是倒着:您需要cd,然后再开始的终端,如果你想这些终端中的新壳由cd受到影响。此外,您需要引用,以确保这两个命令(cd和调用gnome-terminal)都被视为别名的一部分。

alias cmd1='cd ~/Desktop/ && gnome-terminal' 
alias cmd2='cd ~/Documents/ && gnome-terminal' 
alias cmd3='cd ~/Music/ && gnome-terminal' 
alias runcmds='cmd1 & cmd2 & cmd3' 

顺便说一句,我建议 - 强 - 不使用别名所有,并定义功能来代替:

cmd1() { cd ~/Desktop && gnome-terminal; } 
cmd2() { cd ~/Documents && gnome-terminal; } 
cmd3() { cd ~/Music && gnome-terminal; } 
runcmds() { cmd1 & cmd2 & cmd3 & } 

没有任何引述参与(最终&,而不是最后的;通过确保cmd3与其他人一样在子shell中运行)来防止父shell的位置被更改为~/Music。当然,你可以只实现一个功能:

runcmds() { 
    local dir 
    for dir in ~/Desktop ~/Documents ~/Music; do 
    (cd "$dir" && exec gnome-terminal) & 
    done 
} 
+0

谢谢Charles Duffy !!!功能就像一个魅力:) – user3226932

3

其实gnome-terminal利于--working-directory选项。

man gnome-terminal

- 工作目录= DIRNAME
         设置终端的工作目录,以目录名。

如下您可以使用别名:

alias cmd1='gnome-terminal --working-directory="$HOME/Desktop"' 
alias cmd2='gnome-terminal --working-directory="$HOME/Documents"' 
alias cmd3='gnome-terminal --working-directory="$HOME/Music"' 
alias runcmds='cmd1 & cmd2 & cmd3'