Когда я указываю версии gitrevision в pwsh (например, HEAD@{3}), я должен условно не забыть заключить версию gitrevision в кавычки. Если я этого не сделаю, он будет рассматривать «@» как оператор подвыражения массива.
Пример:
pwsh$ git checkout HEAD@{3}
fatal: ambiguous argument ‘HEAD@‘: unknown revision or path not in the
working tree
Как я могу настроить git (2.44.0) или pwsh (7.4.2), чтобы предотвратить появление этих конфликтующих символов?
Я пробовал использовать псевдонимы git и pwsh, но они оба являются только псевдонимами команд.
Как я могу настроить git (2.44.0) или pwsh (7.4.2), чтобы предотвратить появление этих конфликтующих символов?
Вы не можете. Вы не можете обойти правила синтаксиса используемой вами оболочки.
PowerShell необычен тем, что в нем больше метасимволов (символов со специальным значением), чем в других оболочках, в частности, включая @ { } , ; `
(подробности см. в этом ответе).
Чтобы использовать эти символы дословно, вам необходимо:
либо: экранируйте их по отдельности, используя `
(обратный апостроф), escape-символ PowerShell .
git ... HEAD@`{3`}
— обратите внимание, что @
в этом случае не требует экранирования, поскольку он встречается внутри аргумента.или: заключите весь аргумент, содержащий метасимволы, в кавычки (либо '...'
для создания дословных строк, либо "..."
для расширяемых (интерполирующих).
git ... 'HEAD@{3}'
Существует строго ограниченный способ запретить PowerShell применять свои обычные правила синтаксического анализа, а именно --%
, токен остановки синтаксического анализа (сводку ограничений см. в нижней части этого ответа).
Однако вам все равно нужно не забывать использовать его при необходимости.[1]
git ... --% HEAD@{3}
Я должен условно не забыть заключить его в кавычки.
Если вы не хотите узнавать, какие (дополнительные) символы необходимо экранировать или заключать в кавычки в PowerShell, единственный вариант — вызвать другую оболочку, например cmd.exe
в Windows, и передать командную строку для вызова в виде одной строки.
Однако это может создать проблемы с цитированием и снизить производительность.
cmd /c 'git ... HEAD@{3}'
[1] To ease the pain of typing --%
, jthill suggests defining a keyboard shortcut such as Alt+/
that automatically inserts it. You can do so by placing the following in your $PROFILE
file:Set-PSReadLineKeyHandler -Chord Alt+/ -ScriptBlock { [Microsoft.PowerShell.PSConsoleReadLine]::Insert('--%') }
.
Note that on Unix-like platforms the set of key chords available to the PSReadLine module is limited, as discussed in this GitHub comment; e.g. Ctrl+/
works only on Windows.
@jthill, пожалуйста, прочти мое обновление (сноска).
каждый эмулятор терминала, который я знаю, предоставляет ctrl-/ как ascii ctrl-_ (поскольку / находится за пределами диапазона ascii переключения бита ctrl), ctrl-/ у меня работает нормально.
@jthill, это может быть ограничение PowerShell (в частности, его модуля PSReadLine
) и/или API .NET. По крайней мере, лично я не могу заставить Ctrl+/ работать в macOS и WSL в PowerShell. Связанный комментарий GitHub содержит дополнительную информацию.
Попробуйте Set-PSReadLineKeyHandler -Chord Ctrl+_ -ScriptBlock { [Microsoft.PowerShell.PSConsoleReadLine]::Insert('--%') }
, я, вероятно, не помог, не упомянув, какой код на самом деле генерируют нажатия клавиш, извините за это.
Спасибо, @jthill, но у меня это не работает ни в macOS, ни внутри WSL.
Хм. Bash использует readline, у меня есть ctrl-/, привязанный к
~/
там и в моем редакторе, есть ли в PowerShell возможность привязки клавиш, чтобы вы могли легко печатать--%
там?