小编six*_*ude的帖子

这个 shell/Bash 语法是什么:someVariable=someValue someCommand

我的一位同事为我提供了一种我不熟悉的 Bash 语法。我的 Google foo 无法弄清楚它的作用以及为什么/何时应该使用它。

他发给我的命令是这样的:

someVariable=something command
Run Code Online (Sandbox Code Playgroud)

最初,我认为这等效于以下内容:

someVariable=something ; command
Run Code Online (Sandbox Code Playgroud)

或者

someVariable=something 
command
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。例子:

[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ

[Jan-03 11:27][~]$ # Try running a command of the same format    
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ

[Jan-03 11:27][~]$    
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:    
[Jan-03 11:27][~]$ echo $BAZ

[Jan-03 11:27][~]$    
[Jan-03 11:28][~]$    
[Jan-03 11:28][~]$ # If we add a semi-colon to …
Run Code Online (Sandbox Code Playgroud)

command-line shell bash environment-variables

27
推荐指数
3
解决办法
2553
查看次数

在执行之前在命令中展开通配符

假设我想输入如下内容:

rm build/* tmp/*
Run Code Online (Sandbox Code Playgroud)

我即将运行它,但我想在执行之前扩展通配符,以便我可以验证即将发生的事情。我怎样才能做到这一点?

这是我正在寻找的工作流程:

$ rm build/* tmp/* <press some magic key>
$ rm build/foo build/bar tmp/wiz tmp/buzz
Run Code Online (Sandbox Code Playgroud)

(编辑)另一个示例工作流程:

$ # Check what is in directory: 
$ ls -0
foo1
foo2
bar
$ # I want to delete foo1 and foo2, but want to do so carefully: 
$ rm f*o <press some magic key>
$ rm foo1 foo2
Run Code Online (Sandbox Code Playgroud)

我可以像这样扩展其他东西:

cd `hg root` <Ctrl-x>
cd /users/bob/myMercurialRepository
Run Code Online (Sandbox Code Playgroud)

(因为我Control-x shell-expand-line在我的~/.inputrc)。

我虽然man bash看着通配符的描述进行了挖掘,但找不到任何有趣的东西。

command-line bash wildcards

6
推荐指数
2
解决办法
827
查看次数

Bash:如何将每个命令的输出重定向到文件?

我经常像这样在我的源代码存储库上运行搜索:

ack -l "foo bar" .
Run Code Online (Sandbox Code Playgroud)

搜索可能需要 10-60 秒并产生如下输出:

path/to/file1       
path/to/file2
path/to/file3
Run Code Online (Sandbox Code Playgroud)

我经常使用这个别名来打开在 vim 中找到的所有文件:

alias go='gvim `fc -s` -p'
Run Code Online (Sandbox Code Playgroud)

这工作正常,但fc -s重新运行前一个命令,这可能需要几秒钟或几分钟。


将这样的内容附加到我以交互方式运行的每个命令中会非常有用:

| tee /tmp/lastCommand to all commands.  
Run Code Online (Sandbox Code Playgroud)

这样,如果输出显示自己有用,那么我可以对它做其他事情。

用法示例:

类型:

find . -type f 
Run Code Online (Sandbox Code Playgroud)

执行以下操作:

find . -type f | tee $lastOutLocation # Where lastOutputLocation=/tmp/lastOutput
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这样的东西来过滤上一个命令:

lastOut | grep "SomeString" # Where lastOut is an alias to cat $lastOutputLocation
Run Code Online (Sandbox Code Playgroud)

有没有一种机制可以用来做这样的事情? 我不认为别名会暴露这种行为。

潜在的障碍:

  • 获得一些适用于复合命令的东西: echo 'baz' ; echo 'bar'
  • 弄清楚如何在运行之前修改用户键入的命令
  • 忽略诸如交互式输入之类的东西。不想捕获密码提示

可能的解决方案,我目前正在探索:

bash alias

5
推荐指数
1
解决办法
1175
查看次数

在 PS1 中使用 echo -e 会导致 shell 中出现换行问题

问题

打开命令行提示符:

在此处输入图片说明

多次输入字母 a:

在此处输入图片说明

输入的文本不是换行,而是换行到同一行:

在此处输入图片说明

现在,开始按 b。第二次需要换行时,它将换行到新行:

在此处输入图片说明


是什么导致了这种行为?

像这样使用 PS1 会导致以下行为:

ps1Color="\033[1;35m"
export PS1='$(echo -en $ps1Color) Baz $'
Run Code Online (Sandbox Code Playgroud)

请注意,我想直接使用 echo 而不是颜色的原因是因为我想根据上一个命令的退出状态有条件地添加颜色

直接使用颜色不会导致此行为发生。


我的问题是:

  • 如何使用 echo打印用于 PS1 的颜色代码?
  • 如果我想让我的 PS1 有条件地变成不同的颜色,最好的方法是什么?
  • 为什么我会看到这种行为?

更新

明确地说,我真的想使用 echo 来做到这一点,因为我想有条件地改变颜色。

这是我目前拥有的:

function setPs1Colors_start () {

    local previousExit=$?

    local ps1Color="\033[1;35m"
    local ps1FailBackground="\e[41m"

    echo -en $ps1Color

    if [[ previousExit -ne 0 ]]
    then
        echo -en $ps1FailBackground
    fi

}

function setPs1Colors_end () {
    local ps1DefaultColor="\033[0m"
    echo -en $ps1DefaultColor
}

export PS1='$(setPs1Colors_start)[$(date +%b\-%d\ …
Run Code Online (Sandbox Code Playgroud)

bash prompt

0
推荐指数
1
解决办法
2654
查看次数