Программа "execinput" считывает входные строки из стандартного ввода и сохраняет их в массив символов "буфер", а затем делает это:
system(buffer);
Пусть "команда" будет любым допустимым набором программ, параметров,и синтаксис bash.В идеале следующие две строки дадут один и тот же результат (на данный момент игнорируя обработку любых двойных кавычек внутри «команды»):
command
echo "command" | execinput
Это действительно так в системе linux, работающей в оболочке bash,Однако в bash в оболочке «Msys2 MingW 32bit» это происходит (конечная точка с запятой после 3 является преднамеренной):
echo 1; echo 2; echo 3;
1
2
3
echo "echo 1; echo 2; echo 3;" | execinput
1 ; echo 2; echo 3;
echo "echo 1 & echo 2 & echo 3;" | execinput
1
2
3;
Символ «&» - это то, что cmd.exe использует для разделения подкоманд.Эта последняя команда в системе Linux, либо непосредственно в bash, либо через system (), дает:
3
1
2
В среде Linux-bash все команды выполняются одинаково, независимо от того, выполняются ли они напрямую или через system()
вexecinput()
.В среде MSYS2 они этого не делают.
Я считаю, что COMSPEC
и PATH
как-то участвуют, но установив первое так:
export COMSPEC="C:\progs\msys32\usr\bin\bash.exe -c "
вместо COMSPEC по умолчаниюзначение:
C:\Windows\system32\cmd.exe
результаты все равно были не такими.
Может кто-нибудь объяснить, что здесь происходит, и, как мы надеемся, как заставить "команду" выдавать то же самое непосредственно в командной строке bash и когда вызывается с system()
?
Подробнее.В командной строке bash в MSYS2:
echo 'set' | execinput > short.txt
echo 'bash -c "set"' | execinput > long.txt
затем сравните содержимое файла.ключевые различия:
- long.txt имеет 11 символов BASH * плюс DIRSTACK, EUID, ГРУППЫ, IFS, MACHTYPE, OPTERR, OPTIND, OSTYPE, PPID, SHELLOPTS, UID.
Short.txt не имеет их. - SYSTEMROOT, COMSPEC, CONTITLE, HOMEPATH и многие другие в одинарных кавычках в long.txt, в short.txt нет кавычек.
В остальном строки одинаковые. - PWD полностью в синтаксисе linux / posix в long.txt и имеет корень в верхней части файловой системы MSYS2.PWD имеет гибридный синтаксис в short.txt (начинается с C: затем имеет путь / разделенный /) и является полным путем Windows.
- PATH в long.txt начинается с записей синтаксиса linux / posix, root - вв верхней части файловой системы MSYS2, затем следуют записи, такие как / c / Windows / System32.Short.txt содержит записи, которые имеют полный синтаксис Windows.
- Long.txt имеет SHLVL = 2, short.txt имеет SHLVL = 1.