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
命令在 两种 情况下抛出错误:
- 如果管道(通常只有一个进程)退出并出现 non-zero 错误。
- 如果管道写入标准错误 并且
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
}
我有以下用于将文件添加到 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
命令在 两种 情况下抛出错误:
- 如果管道(通常只有一个进程)退出并出现 non-zero 错误。
- 如果管道写入标准错误 并且
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
}