git bash 中的 LF 警告后 tcl 脚本停止

tcl script stops after LF warning in git bash

我有以下用于将文件添加到 git 的脚本。我正在 运行 使用 tclsh

在 git bash 上安装它
proc git_add {file_ext file_type folder} {
  try {
    set results [exec git add $file_ext]
  } trap CHILDSTATUS {results options} {
    puts "Warning: No $file_type files update has been found in $folder"
  }
}

  puts "Files will be added to git now "
  set path "src"
  cd $path
  git_add "*.vhd" "Project" $path
  git_add "*.v" "Project" $path
  git_add "*.sv" "Project" $path

当我尝试 运行 脚本时,如果文件有 LF 而不是 CRLF,它会发出警告并停止。

错误如下:

Files will be added to git now warning: LF will be replaced by CRLF in intel/fpgas/fpga_link2/rtl/prbstest.vhd. The file will have its original line endings in your working directory.

while executing "exec git add $file_ext"

(procedure "git_add" line 2)

invoked from within "git_add *.vhd "VHD" $path"

如何解决?

默认情况下,Tcl 将标准错误通道上的输出视为错误。来自 git 命令的警告很可能出现在 stderr 上。不幸的是,这种情况不会产生可以通过 try 命令捕获的有用错误代码。因此,您需要使用 on error 子句捕获一般错误,或者将 -ignorestderr 选项添加到 exec 命令以禁用此行为。

set results [exec -ignorestderr git add $file_ext]

exec 命令在 两种 情况下抛出错误:

  1. 如果管道(通常只有一个进程)退出并出现 non-zero 错误。
  2. 如果管道写入标准错误 并且 exec 捕获该错误。

这是您遇到的第二个案例。您需要决定您希望该消息发生什么。

一个简单的选择是重定向它,以便用户可以在他们的终端中看到它。

proc git_add {file_ext file_type folder} {
  try {
    set results [exec git add $file_ext 2>@stdout]
  } trap CHILDSTATUS {results options} {
    puts "Warning: No $file_type files update has been found in $folder"
  }
}

这(2>@stderr)将它重定向到 Tcl stdout 通道(任何通道都可以,只要它有一个 OS 文件描述符)。


如果您使用 open | 启动管道并可以访问其输入 and/or 输出,则当您 close 通道时会抛出错误。 exec 大约是这样的(除了更多的错误处理,它是用 C 编写的):

proc exec args {
    set f [open |$args]
    set data [read $f]
    close $f
    return $data
}