Я написал приведенный ниже сценарий оболочки, при использовании -ne
он дает результат Synced, но также с предупреждающим сообщением : integer expression expected
.
Когда я использую !=
, это дает NotSynced...
Дата и время PowerShell отличается от даты и времени Ubuntu?! (Я сравниваю целые числа со строками!?)
#!/bin/bash
WinTime=$(powershell.exe "& {get-date -UFormat '%Y/%m/%d %H:%M:%S'}")
WSLTime=$(date +"%Y/%m/%d %H:%M:%S")
echo "$WinTime"
echo "$WSLTime"
if [ "$WinTime" != "$WSLTime" ]; then
echo "🪟 Windows: $WinTime"
echo "🐧 WSL: $WSLTime"
echo "NotSynced"
else
echo "Synced"
fi
Использование !=
:
Использование -ne
:
🤔 А знаете ли вы, что...
Bash поддерживает механизмы перенаправления ввода и вывода для команд и скриптов.
Первоначальная проблема вопроса заключалась в разнице между -ne
и !=
; это было рассмотрено в комментариях.
Как только OP переключился на использование !=
, это позволило второй проблеме всплыть наверх ... !=
оценивалось как «истина», когда две строки казались одинаковыми.
Этот ответ касается второй проблемы...
Я запускаю bash
в среде cygwin
(т. е. под Windows, поэтому у меня есть доступ к powershell.exe
).
Запустив код OP, я также получаю те же результаты:
Windows: 2023/02/07 09:32:47
WSL: 2023/02/07 09:32:47
NotSynced
Если мы посмотрим на фактическое содержимое этих двух переменных, мы увидим:
$ echo "$WinTime" | od -c
0000000 2 0 2 3 / 0 2 / 0 7 0 9 : 3 2
0000020 : 4 7 \r \n
0000025
$ echo "$WSLTime" | od -c
0000000 2 0 2 3 / 0 2 / 0 7 0 9 : 3 2
0000020 : 4 7 \n
0000024
Обратите внимание, что $WinTime
включает завершающий \r
(окончание строки windows/dos), который является результатом запуска бинарного файла Windows powershell.exe
. Этот дополнительный \r
приводит к тому, что условное выражение оценивается как «истина» и, таким образом, печатается NotSynced
.
ОП захочет удалить трейлинг \r
.
Я недостаточно знаю о powershell
, чтобы знать, есть ли возможность отключить \r
, поэтому я позволю tr
удалить \r
:
WinTime=$(powershell.exe "& {get-date -UFormat '%Y/%m/%d %H:%M:%S'}" | tr -d '\r')
Мы видим, что \r
больше не существует:
$ echo "$WinTime" | od -c
0000000 2 0 2 3 / 0 2 / 0 7 0 9 : 3 6
0000020 : 2 2 \n
0000024
И теперь условное выражение оценивается как «ложь» и печатает Synced
.
ПРИМЕЧАНИЕ. Сценарий может по-прежнему сообщать NotSynced
в сценарии, в котором две команды захвата времени выполняются непосредственно до/после изменения секунд.