安装 rtool 后 bash/cygwin 损坏?

安装 rtool 后 bash/cygwin 损坏?

通常我可以自己(和谷歌)解决问题。但最近我对这种奇怪的现象感到困惑。

背景:我使用一系列脚本进行文件处理(在 Windows 中,在 Cygwin 下。脚本也在 OS X 上使用 gnu baseutil 运行)。安装一天后实时工具,我的脚本停止工作。经过一番麻烦之后,我终于发现了一个问题。

问题:我有以下行:

key=$( echo "$foo" | tr -d - | tr '[:upper:]' '[:lower:]' )

其中$foo只是另一个文本变量。我删除了破折号$foo并将其转换为小写。该脚本运行了数千次。

但现在不行了。如果我跑

echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'

我明白blahbleh这是预期的。但如果我这样做

a=$(echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]')
echo $a

我什么也没得到。$a为空并且 [[ -z $a ]] 返回true。但是,如果我恢复到老式反引号,该命令将再次起作用:

a=`echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'`
echo $a

给出blahbleh.

现在我将所有命令替换替换为旧样式,但这更多的是一种解决方法而不是解决方案。那么我的 StackExchangers 同胞们,我错过了什么以及如何解决它?真的很烦人。

附注到目前为止我自己的诊断:

  • 卸载 Rtools 没有帮助;
  • 重新启动机器没有帮助;
  • 重新安装每一个Cygwin 包没有帮助;
  • bash版本是4.3.42(4);
  • ~/.bashrc现在我在、~/.bash_profile~/.profile/etc/profile中一无所有/etc/bash.bashrc。在Rtools之前不确定;
  • 我看不出有什么问题$PATH

答案1

好吧,经过大量的摆弄和拉扯之后,我已经成功地将 Cygwin 恢复到工作状态。这就是我所做的:

  1. 删除了 Rtools
  2. 清除任何 Cygwin/Rtools 相关条目的 Windows %PATH%;
  3. 重新安装了所有 Cygwin 软件包(来自缓存);
  4. 重新设计的 Cygwin;
  5. 并且重新启动计算机的次数超过了需要的次数。

回去工作...

附言。尽管 Cygwin 再次工作,但我发现为 bash 数组赋值的原始行不再产生正确的结果。必须改变这个

read -r -a array <<<$(printf $string)

对此

array=($(printf $string))

使其发挥作用。一定是 bash 更新,一定是。

答案2

我不太清楚为什么你的管道没有按预期工作,但我确实知道它可以做得更好:

a='Blah-Bleh'
a=${a//-/}; a=${a,,}
printf '%s\n' "$a"

这使用内置替换,bash并且比命令替换更快。第一个,a=${a//-/},将删除 中的所有破折号$a,而第二个,a=${a,,}将小写整个字符串。

bash这应该在4.0 及更高版本中有效。

相关内容