Странное поведение, вызванное cygwin, bash, sed и export - PullRequest
0 голосов
/ 10 сентября 2018

Извините.Я был так обеспокоен этой проблемой, что не ложился спать до 3.00.В то время мой мозг был беспорядочным, а старое описание проблемы - беспорядком.Я переписал описание проблемы и удалил старое.


Я обнаружил странное поведение в отношении 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 и запуск bash в conemu.В 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 ""

Я также пытался запустить его без --login,результаты одинаковы.

В заключение, есть четыре случая, и только результат экспорта = 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 ""
...