我在git-stash中看到过这样的代码片段
rm -f "$TMP-index" &&
GIT_INDEX_FILE="$TMP-index" git read-tree HEAD &&
# find out what the user wants
GIT_INDEX_FILE="$TMP-index" \
git add--interactive --patch=stash -- &&
# state of the working tree
w_tree=$(GIT_INDEX_FILE="$TMP-index" git write-tree) ||
die "$(gettext "Cannot save the current worktree state")"
git diff-tree -p HEAD $w_tree -- >"$TMP-patch" &&
test -s "$TMP-patch" ||
die "$(gettext "No changes selected")"
rm -f "$TMP-index" ||
die "$(gettext "Cannot remove temporary index (can't happen)")"我不明白的是这样的表达:
GIT_INDEX_FILE="$TMP-index" git read-tree HEAD这是否意味着将TMP-index的值赋给GIT_INDEX_FILE,然后执行命令git read-tree HEAD
这一点我不太确定。所以我试着写一个类似的命令,如下所示。
A="1" ls
echo $AA的值仍然是null。
我还尝试了这个:
echo $a
=> 1
k=$(a=100 echo $a)
=>
echo $k
=> 1看起来a的值根本没有改变。所以a=100看起来没用..
有没有人对这样的语法有想法?
发布于 2013-01-01 01:33:00
是否意味着将
TMP-index的值赋给GIT_INDEX_FILE,然后执行命令git read-tree HEAD?
不完全是。语法:
VAR1=val1 VAR2=val2 somecommand arg1 arg2告知shell使用参数arg1和arg2执行命令somecommand,但somecommand的环境将VAR1设置为val1,VAR2设置为val2。shell本身不会受到这些赋值的影响,只受somecommand的环境影响。效果相当于:
env VAR1=val1 VAR2=val2 somecommand arg1 arg2唯一的区别是,前一种方法不需要查找和执行/usr/bin/env实用程序(我假设env不是一个外壳内置实用程序),因此它的速度要快得多。
它也等同于:
(export VAR1=val1 VAR2=val2; somecommand arg1 arg2)请注意括号--这会导致shell在单独的子shell中执行命令。对子subshell所做的任何更改(例如变量赋值)在该子subshell结束时都不会保留。
示例
#!/bin/sh
FOO=value1
printf %s\\n "In the shell, FOO is ${FOO} (before running python)"
FOO=value2 python -c 'import os; print "In python, FOO is", os.environ["FOO"]'
printf %s\\n "In the shell, FOO is ${FOO} (after running python)"上面的脚本打印以下输出:
In the shell FOO is value1 (before running python)
In python, FOO is value2
In the shell, FOO is value1 (after running python)Git在做什么
在您提供的Git shell代码片段中,git stash临时更改了一些git调用的GIT_INDEX_FILE,以便stash可以执行一些索引变异操作,而不会扰乱您的索引:
git stash使用git read-tree创建临时索引文件,并将其内容初始化为HEAD.git stash使用git add --interactive询问用户要隐藏哪些部分,并将所选更改保存在临时索引文件中。git stash使用git write-tree将临时索引的内容作为树对象保存在Git repository.git stash将树对象与HEAD进行比较,以确保您确实选择了要Git的内容git stash删除它创建的临时索引文件。发布于 2012-12-31 13:45:18
你的问题的答案是“这是否意味着……”是的是的。
有多种方法可以查看一行环境变量表达式的结果;您可以观察到...
$ B=100 env | grep B
B=100...or...
$ z=abc sh -c 'echo $z'
abc发布于 2012-12-31 13:51:56
在BASH中,定义一个变量并在之后运行一个新流程存在一些问题。
如果您只是定义变量,则新进程不会继承该变量
让我们定义一个变量
$ VAR='value'
$ echo $VAR
value然后进入一个新的过程
$ bashvar未定义
$ echo $VAR
$但是一旦我们回来了
$ exit将重新定义var
$ echo $VAR
value
$ 通常的解决方法是使用export
$ export VAR2='yep'
$ bash
$ echo $VAR2
yep
$ 您看到的(似乎是)另一种语法,它在子进程中赋值变量,而不是在原始进程中赋值
$ var3='wow' bash #this line opens a new bash, and assigns the variable for this new bash
$ echo $var3
wow
$ exit
$ echo $var3
$ https://stackoverflow.com/questions/14097834
复制相似问题