cygwin、bash、sed和export导致的奇怪行为

cygwin、bash、sed和export导致的奇怪行为,bash,sed,cygwin,Bash,Sed,Cygwin,对不起。我被这个问题困扰到凌晨3点才上床睡觉。当时我的大脑一片混乱,旧的问题描述一团糟。我已经重写了问题描述并删除了旧的描述 我发现cygwin、bash、sed和export有一种奇怪的行为。 将以下代码保存到文件中,例如/r/a.sh echo PATH is $PATH echo the sed in use is `which sed` echo 1 | sed 's|1|22|g' result=`echo 1 | sed 's|1|22|g'` echo \`xxx\` wit

对不起。我被这个问题困扰到凌晨3点才上床睡觉。当时我的大脑一片混乱,旧的问题描述一团糟。我已经重写了问题描述并删除了旧的描述


我发现cygwin、bash、sed和export有一种奇怪的行为。 将以下代码保存到文件中,例如/r/a.sh

echo PATH is $PATH
echo the sed in use is `which sed`

echo 1 | sed 's|1|22|g'

result=`echo 1 | sed 's|1|22|g'`
echo \`xxx\` without export
echo the result is \"$result\"
echo \`xxx\` with export
export result=`echo 1 | sed 's|1|22|g'`
echo the result is \"$result\"
echo \$\(xxx\) without export
result="$(echo 1 | sed 's|1|22|g')"
echo the result is \"$result\"
echo \$\(xxx\) with export
export result="$(echo 1 | sed 's|1|22|g')"
echo the result is \"$result\"

read
所有四种情况的预期结果为22。我尝试过的大多数环境都是这样,比如Debian、zsh和在conemu中运行bash。在conemu,结果是:

PATH is /usr/local/bin:/usr/bin:/d/PortableAppsLocal/ConEmu/ConEmu/Scripts:/d/PortableAppsLocal/ConEmu:/d/PortableAppsLocal/ConEmu/ConEmu:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/em64t/bin:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/ia32/bin:/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/ProgramData/chocolatey/bin:/c/Program Files (x86)/GNU/GnuPG/pub:/c/Program Files/IBM/Bluemix/bin:/c/Program Files/MATLAB/R2018a/runtime/win64:/c/Program Files/MATLAB/R2018a/bin:/c/Program Files/Git/cmd:/c/Program Files (x86)/Subversion/bin:/c/WINDOWS/System32/OpenSSH:/c/Program Files/OpenVPN/bin:/c/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility:/c/Users/user/AppData/Local/Microsoft/WindowsApps:/d/Cloud/Win+R:/usr/bin:/d/Python/Python36:/d/Python/Python36/Scripts:/c/Program Files/Oracle/VirtualBox:/d/PortableAppsLocal/bin:/d/Python/Python27:/d/Python/Python27/Scripts:/c/Program Files (x86)/Subversion/bin:/c/Program Files/LLVM/bin:/d/gccarm/bin:/c/Program Files/Java/jre1.8.0_172/bin:/d/lint:/c/Users/user/AppData/Local/atom/bin:/c/Program Files/Microsoft VS Code/bin
the sed in use is /usr/bin/sed
22
`xxx` without export
the result is "22"
`xxx` with export
the result is "22"
$(xxx) without export
the result is "22"
$(xxx) with export
the result is "22"
但是,如果我通过D:\cygwin64\bin\bash.exe--login/r/a.sh运行它,结果是

PATH is /usr/local/bin:/usr/bin:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/em64t/bin:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/ia32/bin:/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/ProgramData/chocolatey/bin:/c/Program Files (x86)/GNU/GnuPG/pub:/c/Program Files/IBM/Bluemix/bin:/c/Program Files/MATLAB/R2018a/runtime/win64:/c/Program Files/MATLAB/R2018a/bin:/c/Program Files/Git/cmd:/c/Program Files (x86)/Subversion/bin:/c/WINDOWS/System32/OpenSSH:/c/Program Files/OpenVPN/bin:/c/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility:/c/Users/user/AppData/Local/Microsoft/WindowsApps:/d/Cloud/Win+R:/usr/bin:/d/Python/Python36:/d/Python/Python36/Scripts:/c/Program Files/Oracle/VirtualBox:/d/PortableAppsLocal/bin:/d/Python/Python27:/d/Python/Python27/Scripts:/c/Program Files (x86)/Subversion/bin:/c/Program Files/LLVM/bin:/d/gccarm/bin:/c/Program Files/Java/jre1.8.0_172/bin:/d/lint:/c/Users/user/AppData/Local/atom/bin:/c/Program Files/Microsoft VS Code/bin
the sed in use is /usr/bin/sed
22
`xxx` without export
the result is ""
`xxx` with export
the result is "22"
$(xxx) without export
the result is ""
$(xxx) with export
the result is ""
我还尝试使用sed的绝对路径

echo run with absolute path /sed/bin

echo 1 | sed 's|1|22|g'

result=`echo 1 | /bin/sed 's|1|22|g'`
echo \`xxx\` without export
echo the result is \"$result\"
echo \`xxx\` with export
export result=`echo 1 | /bin/sed 's|1|22|g'`
echo the result is \"$result\"
echo \$\(xxx\) without export
result="$(echo 1 | /bin/sed 's|1|22|g')"
echo the result is \"$result\"
echo \$\(xxx\) with export
export result="$(echo 1 | /bin/sed 's|1|22|g')"
echo the result is \"$result\"

read
结果仍然不明朗

run with absolute path /sed/bin
22
`xxx` without export
the result is ""
`xxx` with export
the result is "22"
$(xxx) without export
the result is ""
$(xxx) with export
the result is ""
我也试过不用登录就运行它,结果是一样的

总之,有四种情况,只有导出结果=
xxx
按预期工作


我尝试在脚本开始时添加set-x,结果如下

C:\Users\user>D:\cygwin64\bin\bash.exe --login /r/a.sh
+ echo PATH is /usr/local/bin:/usr/bin:/c/Program Files '(x86)/Intel/MPI-RT/4.1.3.045/em64t/bin:/c/Program' Files '(x86)/Intel/MPI-RT/4.1.3.045/ia32/bin:/c/Program' Files '(x86)/Common' Files/Oracle/Java/javapath:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/ProgramData/chocolatey/bin:/c/Program Files '(x86)/GNU/GnuPG/pub:/c/Program' Files/IBM/Bluemix/bin:/c/Program Files/MATLAB/R2018a/runtime/win64:/c/Program Files/MATLAB/R2018a/bin:/c/Program Files/Git/cmd:/c/Program Files '(x86)/Subversion/bin:/c/WINDOWS/System32/OpenSSH:/c/Program' Files/OpenVPN/bin:/c/Program Files '(x86)/STMicroelectronics/STM32' ST-LINK Utility/ST-LINK Utility:/c/Users/user/AppData/Local/Microsoft/WindowsApps:/d/Cloud/Win+R:/usr/bin:/d/Python/Python36:/d/Python/Python36/Scripts:/c/Program Files/Oracle/VirtualBox:/d/PortableAppsLocal/bin:/d/Python/Python27:/d/Python/Python27/Scripts:/c/Program Files '(x86)/Subversion/bin:/c/Program' Files/LLVM/bin:/d/gccarm/bin:/c/Program Files/Java/jre1.8.0_172/bin:/d/lint:/c/Users/user/AppData/Local/atom/bin:/c/Program Files/Microsoft VS Code/bin
PATH is /usr/local/bin:/usr/bin:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/em64t/bin:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/ia32/bin:/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/ProgramData/chocolatey/bin:/c/Program Files (x86)/GNU/GnuPG/pub:/c/Program Files/IBM/Bluemix/bin:/c/Program Files/MATLAB/R2018a/runtime/win64:/c/Program Files/MATLAB/R2018a/bin:/c/Program Files/Git/cmd:/c/Program Files (x86)/Subversion/bin:/c/WINDOWS/System32/OpenSSH:/c/Program Files/OpenVPN/bin:/c/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility:/c/Users/user/AppData/Local/Microsoft/WindowsApps:/d/Cloud/Win+R:/usr/bin:/d/Python/Python36:/d/Python/Python36/Scripts:/c/Program Files/Oracle/VirtualBox:/d/PortableAppsLocal/bin:/d/Python/Python27:/d/Python/Python27/Scripts:/c/Program Files (x86)/Subversion/bin:/c/Program Files/LLVM/bin:/d/gccarm/bin:/c/Program Files/Java/jre1.8.0_172/bin:/d/lint:/c/Users/user/AppData/Local/atom/bin:/c/Program Files/Microsoft VS Code/bin

C:\Users\user>D:\cygwin64\bin\bash.exe --login /r/a.sh
+ echo PATH is /usr/local/bin:/usr/bin:/c/Program Files '(x86)/Intel/MPI-RT/4.1.3.045/em64t/bin:/c/Program' Files '(x86)/Intel/MPI-RT/4.1.3.045/ia32/bin:/c/Program' Files '(x86)/Common' Files/Oracle/Java/javapath:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/ProgramData/chocolatey/bin:/c/Program Files '(x86)/GNU/GnuPG/pub:/c/Program' Files/IBM/Bluemix/bin:/c/Program Files/MATLAB/R2018a/runtime/win64:/c/Program Files/MATLAB/R2018a/bin:/c/Program Files/Git/cmd:/c/Program Files '(x86)/Subversion/bin:/c/WINDOWS/System32/OpenSSH:/c/Program' Files/OpenVPN/bin:/c/Program Files '(x86)/STMicroelectronics/STM32' ST-LINK Utility/ST-LINK Utility:/c/Users/user/AppData/Local/Microsoft/WindowsApps:/d/Cloud/Win+R:/usr/bin:/d/Python/Python36:/d/Python/Python36/Scripts:/c/Program Files/Oracle/VirtualBox:/d/PortableAppsLocal/bin:/d/Python/Python27:/d/Python/Python27/Scripts:/c/Program Files '(x86)/Subversion/bin:/c/Program' Files/LLVM/bin:/d/gccarm/bin:/c/Program Files/Java/jre1.8.0_172/bin:/d/lint:/c/Users/user/AppData/Local/atom/bin:/c/Program Files/Microsoft VS Code/bin
PATH is /usr/local/bin:/usr/bin:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/em64t/bin:/c/Program Files (x86)/Intel/MPI-RT/4.1.3.045/ia32/bin:/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/c/ProgramData/Oracle/Java/javapath:/c/WINDOWS/system32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell/v1.0:/c/ProgramData/chocolatey/bin:/c/Program Files (x86)/GNU/GnuPG/pub:/c/Program Files/IBM/Bluemix/bin:/c/Program Files/MATLAB/R2018a/runtime/win64:/c/Program Files/MATLAB/R2018a/bin:/c/Program Files/Git/cmd:/c/Program Files (x86)/Subversion/bin:/c/WINDOWS/System32/OpenSSH:/c/Program Files/OpenVPN/bin:/c/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility:/c/Users/user/AppData/Local/Microsoft/WindowsApps:/d/Cloud/Win+R:/usr/bin:/d/Python/Python36:/d/Python/Python36/Scripts:/c/Program Files/Oracle/VirtualBox:/d/PortableAppsLocal/bin:/d/Python/Python27:/d/Python/Python27/Scripts:/c/Program Files (x86)/Subversion/bin:/c/Program Files/LLVM/bin:/d/gccarm/bin:/c/Program Files/Java/jre1.8.0_172/bin:/d/lint:/c/Users/user/AppData/Local/atom/bin:/c/Program Files/Microsoft VS Code/bin
++ which sed
+ echo the sed in use is /usr/bin/sed
the sed in use is /usr/bin/sed
+ echo 1
+ sed 's|1|22|g'
22
+ result=
+ echo '`xxx`' without export
`xxx` without export
+ echo the result is '""'
the result is ""
+ echo '`xxx`' with export
`xxx` with export
++ echo 1
++ sed 's|1|22|g'
+ export result=22
+ result=22
+ echo the result is '"22"'
the result is "22"
+ echo '$(xxx)' without export
$(xxx) without export
+ result=
+ echo the result is '""'
the result is ""
+ echo '$(xxx)' with export
$(xxx) with export
+ export result=
+ result=
+ echo the result is '""'
the result is ""

运行bash登录shell以正确设置路径您可以编辑问题并复制粘贴准确、未修改的输出,包括任何错误消息吗?似乎不重要的更改会产生影响,因此复制粘贴而不是手动转录很重要。您正在将
路径设置为
/bin
,因为您使用
而不是
。此外,您所有的
echo
命令都应该打印类似于
a=“22”
,并带有空格,因此这里显示的实际输出看起来并不是您真正看到的。此外,最后一行的打字错误是,
$c
而不是
$d
。感谢您的回复,并对前面的混乱描述表示抱歉。我已经修改过了@另一方面,新粘贴的结果是准确的、未经修改的输出。没有给出错误消息。