使用bash在git存储库中输出文件

使用bash在git存储库中输出文件,git,bash,Git,Bash,我尝试使用bash在git存储库中以以下方式输出文件: #!/bin/bash files=$(git ls-files -z) while IFS='' read -r -d '' file do echo "filename: $file" done < <(printf '%s' "$files") #/bin/bash files=$(git ls files-z) 而IFS=''读取-r-d''文件 做 echo“文件名:$file” 只需在bash中列出

我尝试使用bash在git存储库中以以下方式输出文件:

#!/bin/bash    

files=$(git ls-files -z)

while IFS='' read -r -d '' file
do
  echo "filename: $file"
done < <(printf '%s' "$files")
#/bin/bash
files=$(git ls files-z)
而IFS=''读取-r-d''文件
做
echo“文件名:$file”

只需在bash中列出文件名

#!/bin/bash

files=$(git ls-files)

for file in ${files} ; 
do 
    echo $file ; 
done;

问题不在于
读取
,而在于对
文件的初始分配

bash$ git ls-files -z | wc -c
     301
bash$ files=$(git ls-files -z); echo ${#files}
275
你认为26的差异从何而来?让我们尝试在一个普通的
gitls文件中计算换行符(no
-z
):

最后:

bash$ git ls-files -z | while IFS= read -r -d '' file; do echo "file: $file"; done
file: .gitignore
file: COPYRIGHT
[snipped]

这一切都归结为一个事实,即bash在内部无法将asciinul字节存储在变量中。它只是在
var=$(…)
的情况下将它们完全剥离。

那么您的问题是输出没有写入文件?另外,我不得不猜测,只要你使用printf,你就是在胡闹??请发布整个脚本,以便我们可以看到整个格式。@hedgehog抱歉:没有输出,我正在使用bash(已编辑的问题)也许我错了,但我真的没有看到您在任何时候在任何文件中写入任何输出。。。。。也许这是我不知道的,但是当我想在文件上输出一些东西时,我使用这种格式:tmp/someFile。txt@hedgehog我用我的调试输出前缀“>>>>>”(已编辑的问题)的风格把您弄糊涂了。我只想将我的repo中的所有文件打印到stdout中。但我没有得到任何输出。@n问题似乎与此链接中的信息相关没有错误:)此方法限制了文件名中可以使用的字符,因为它们可以解释为单词分隔符。这就是为什么我尝试使用
-z
选项
git ls files
和bash
read
内置的组合。谢谢您的回答!从$(…)开始是命令替换,shell从命令替换的输出中删除尾随的换行符。可能是这样。@fedorqui:不,shell将用空格替换中间(分隔符)换行符,但这将保留字符数,减去最后一个换行符。实际上,
bash$files=$(gitls文件);echo${#files}
打印
300
bash$ git ls-files -z | while IFS= read -r -d '' file; do echo "file: $file"; done
file: .gitignore
file: COPYRIGHT
[snipped]