Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 这个复杂的shell命令(包含|、&;和sed)是如何工作的?_Linux_Git_Scripting - Fatal编程技术网

Linux 这个复杂的shell命令(包含|、&;和sed)是如何工作的?

Linux 这个复杂的shell命令(包含|、&;和sed)是如何工作的?,linux,git,scripting,Linux,Git,Scripting,我正试图弄清楚如何使用git filter branch,我需要一些基本的Linux脚本命令的帮助 'git ls-files -s | sed "s-\t-&newsubdir/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ git update-index --index-info && mv $GIT_INDEX_FILE.new $

我正试图弄清楚如何使用git filter branch,我需要一些基本的Linux脚本命令的帮助

'git ls-files -s | sed "s-\t-&newsubdir/-" |
                GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                        git update-index --index-info &&
         mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
有人能帮我把这个分解一下,并解释每个部分吗

我最感兴趣的是“|”符号、&&符号和sed命令。

“|”是unix管道命令,它将左侧的命令输出连接到右侧的命令输入。

“&&”是unix“and”命令,当且仅当其左侧的命令成功完成时,才会执行其右侧的命令


“sed”是unix的“流编辑器”,它是一个强大的编辑工具,可以解析和编辑它的输入

|
将前面命令的stdout连接到下面命令的stdin

如果前面命令的返回代码为0(即命令成功),则执行以下命令


sed中的
s
命令是一个替换。它搜索与第一个参数匹配的正则表达式,并将其替换为第二个参数。参数分隔符通常是
/
,但在本例中,它将使用后面的第一个字符
-
。替换中的
&
被替换为整个匹配项。

在这种情况下,这可能无关紧要,但通常linux中有多种脚本语言。文件的第一行应该告诉您是哪一行,您需要在您的问题中包含该信息。@约翰:此代码段可能位于git控件文件中,这意味着特定的shell已经很好地定义或完全未知。谢谢!因此,请澄清:第一个命令将列出文件,从该输出中,sed将\t替换为“newsubdir”,然后sed的输出将设置为新的$GIT_INDEX_FILE.new.Not quite。sed将用
\tnewsubdir
替换
\t
,然后将其导入
git update index--index info
,如果成功,将重命名文件。
git update index
的序言用于定义仅用于执行命令的环境变量。
sed
的结果不会通过管道传输到
git_index_文件=$git_index_文件。
git update index--index info
之前的第一个新的
否,因为
GIT\u INDEX\u FILE=$GIT\u INDEX\u FILE.new
不是命令;它只是修改后面的实际命令。“\”用于在下一行继续该命令(它“转义换行”)。