gpt4 book ai didi

git - Bash 脚本、git 和带空格的文件名

转载 作者:太空狗 更新时间:2023-10-29 14:08:51 38 4
gpt4 key购买 nike

我正在尝试使用 bash 脚本自动化我与 git 的一些交互。为此,我有一个脚本可以 ssh 并列出所有存储库,然后克隆它们。部分脚本显示在这里

DIRS=`ssh $u "ls $p"`;
for DIR in $DIRS; do
echo "ssh://$u$p$DIR"
echo "git clone ssh://$u$p$DIR";
git clone ssh://$u$p$DIR
done

示例参数是

-u user@host

-p /cygdrive/c/Documents\ and\ Settings/somePath

这适用于名称中带有空格的文件路径,直到 git clone 部分抛出有关空格过多的错误。如果我复制并粘贴由

回应的部分
echo "git clone ssh://$u$p$DIR";

然后它克隆就好了。我试图用引号将其括起来,但它会引发错误

does not appear to be a git repository

我做错了什么?

编辑 1

使用git clone "ssh://$u$p$DIR"时出现的错误是

fatal: '/cygdrive/c/Documents\ and\ Settings/somePath/repo1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

最佳答案

如果您的目录名称包含空格,您肯定不希望这样做:

DIRS=`ssh $u "ls $p"`;
for DIR in $DIRS; do

由于您想保留空格而不是将它们用作分隔符,因此普遍接受的做法是告诉 bash 分隔符是换行符:

IFS=$'\n'
for DIR in `ssh $u "ls -1 $p"`; do

如果你真的必须有你的变量 DIRS,你可以使用 bash 的数组变量(这将保留你的空间):

IFS=$'\n'
DIRS=(`ssh $u "ls -1 $p"`)
unset IFS
for DIR in "${DIRS[@]}"; do

另一种通用形式是使用read:

ssh $u "ls -1 $p" | while read DIR; do

或者:

while read DIR; do
...
done < <(ssh $u "ls -1 $p")

但是,不推荐使用这些,因为错误处理(尤其是在 ssh 上,当您开始使用管道时会变得更加复杂。)

到目前为止,一切都只是基本的 bash 脚本。

至于这一行,您需要用双引号将第二个参数引起来,因为 $DIR 中的空格会从中产生第三个参数:

git clone "ssh://$u$p$DIR"

我在 git 中试过这个,它似乎有效。然而,正如@holygeek 所说,用 %20 替换空格似乎也有效,并且在某些情况下可能有益。你可以这样做:

git clone "ssh://$u$p${DIR// /%20}"

关于git - Bash 脚本、git 和带空格的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12340877/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com