我已经尝试了各种形式的以下在庆典脚本:

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

但我不能让语法正确地展开 COLUMNS 环境变量。

我已经尝试了各种形式如下:

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

建议?

有帮助吗?

解决方案

如果不确定,则可以使用该终端上的“COLS的要求,而忘记列:

COLS=$(tput cols)

其他提示

对于任谁来到这里,通过谷歌寻找答案的题目问的一般问题只是一个快速的笔记/摘要(如我)。以下任何方式应该得到引号内获得shell变量工作:

echo "$VARIABLE"
echo "${VARIABLE}"

单引号的使用是主要问题。根据击参考手册

  

在单引号(')围字符保留了引号内的每个字符的文本值。单引号之间可能不会出现单引号,即使前面有反斜杠。   [...]   在双引号(")封闭字符保留了引号中的所有字符的字面意义,$`\,并启用了历史扩展的时候,!除外。字符$和`在双引号中仍然具有特殊意义(参见shell扩展)。 $`"\,或换行:反斜杠后跟当由下列字符只保留它的特殊含义。在双引号中,后面是这些字符中的一个反斜杠被除去了。没有特殊含义的字符之前的反斜杠被保持不变。双引号可以包含双引号内的前面加一个反斜杠它被引用。如果启用,除非出现在双引号的!使用反斜线将执行历史扩展。所述!前述反斜杠不会被删除。   特殊参数*@具有特殊的含义,当在双引号(参见壳牌参数扩展)。

在该特定情况下,在问题提出,$ COLUMNS是具有非标准属性(见上文lhunath的回答)。

的特殊变量

注意, COLUMNS 为:

  1. 环境变量。这是一个普通的庆典的参数设置的庆典本身。
  2. 自动设定在收到 SIGWINCH 信号。

第二点通常意味着你 COLUMNS 变量只会是你的 互动 外壳, 在砸向脚本。

如果你的脚本 stdin 连接到你的终端,你可以手动查找你的终端问你的终端:

tput cols

和使用这个在你的SVN命令:

svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(注:你应该 报价 "$@" 并远离 eval ;-))

以下脚本为我工作对于多重价值 $COLUMNS.我不知道如果你不是设置 COLUMNS 在此之前的呼叫?

#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

你可以回声 $COLUMNS 在你的剧本要看它是否设置是否正确?

您这样做是正确的,所以我想别的东西是错误的(不出口-ING列?)。

调试这些例技巧是使一个专用命令(用于编程语言人的闭合)。创建一个shell脚本命名差异柱这样做的:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"

和只使用

svn diff "$@" --diff-cmd  diff-columns

这样,你的代码是清洁的阅读和更加模块化(自上而下),并且可以操作装配分开(自下而上的方法)测试DIFF-列码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top