Native Linux, в переводе на doskey
Я считаю, что успешно создал сценарий bag + bash полиглотСохраните , используя оболочку bash , чтобы строки заканчивались только LF, а не CRLF в стиле Windows.Кажется, что cmd более воспринимает окончания строк в стиле Unix, чем bash для Windows.
: <<'BASH_PORTION'
@goto batch
BASH_PORTION
# aliases
alias hello="echo Hello world!"
alias ls="dir"
: <<'BATCH_PORTION'
:batch
@echo off & setlocal
for /f "tokens=2* delims== " %%I in (
'findstr "^alias" "%~f0"'
) do doskey %%~I=%%~J
exit /b
BATCH_PORTION
Затем, чтобы создать сценарий, выполните в сценарии bash source scriptfile.bat
.Действительно, именно так ~ / .bashrc и ~ / .profile получают источники при запуске нового сеанса bash.В оболочке cmd вы можете просто выполнить scriptfile.bat
.
Волшебство происходит с осторожным размещением многострочных комментариев heredoc.Интерпретатор bash видит : <<'BASH_PORTION'
как начало многострочного комментария и BASH_PORTION
как его конец.Я получил идею от этого ответа .Используя эти комментарии heredoc, bash можно принудительно игнорировать строки cmd только для пакета.И пакетная обработка обрабатывает любую строку, начинающуюся с :
, как метку, поэтому первая строка не имеет никакого эффекта.
После того, как вы уловили, что каждый интерпретатор игнорирует команды другого, остается только определить псевдонимы.Псевдонимы должны быть определены с использованием двойных кавычек на стороне bash, затем кавычки могут быть удалены с помощью цикла for /f
на стороне пакета с заменой alias
на doskey
.
Native doskey, переводится для Linux
В качестве альтернативы, вы можете просто создать файл макроса в формате doskey в обычном режиме, например:
hi=echo Hello $*
bye=echo Goodbye $*
Чтобы загрузить макросы в консоль cmd, вам достаточно
doskey /macrofile="path\to\macrofile"
... который вы можете поместить в "HKLM \ SOFTWARE \ Microsoft \ Command Processor" в значение автозапуска, если хотите.
Для загрузки макросов в подсистему Linux требуетсянемного массажа для перевода и источника.Нечто подобное могло бы войти в ваш ~ / .bashrc:
t=$(mktemp -p /dev/shm)
awk -v RS='\r\n' -F\= '{print $1"(){ "$2"; }"}'</mnt/c/Users/path/to/macros.doskey >$t
source $t
rm -f $t
unset t
К сожалению, я не смог найти решение, использующее eval
для определения функций или псевдонимов - я предполагаю, потому что eval
порождает новую оболочку, которая не передает изменения среды в область вызова.Таким образом, временный файл, по-видимому, необходим.
Пример добавления перевода пути к файлу
Вторым способом, если вы хотите преобразовать пути файловой системы Windows в нотацию Linux, вы можете сделатьИтак, добавив пару gsub
команд.Возьмем следующий пример macros.doskey :
hi=echo Hello $*
bye=echo Goodbye $*
desktop=pushd "c:\Users\username\desktop" && dir && popd
На стороне Windows вы все равно получите исходный код.
doskey /macrofile="path\to\macros.doskey"
На стороне Linux, вы поместите следующее в ваш .bashrc или аналогичный файл, где он будет оцениваться с помощью source filename
:
alias dir='ls --color=auto'
t=$(mktemp -p /dev/shm)
awk -v RS='\r\n' -F\= '
{
gsub(/[A-Za-z]:\\/, "/mnt/&")
gsub(/\\|:/,"/")
print $1"(){ "$2"; }"
}
'</mnt/c/path/to/macros.doskey >$t
source $t
rm -f $t
unset t
И это заменит все обратные слеши на вперед, заменив c: \ на / mnt / c/ и тому подобное, и создавать функции, используя массированные данные.Важно помнить, что буквы дисков в вашем файле макросов должны быть в том же регистре, что и в / mnt.Также я протестировал эти скрипты, используя gawk
.По умолчанию многие дистрибутивы Linux используют mawk
в качестве включенного интерпретатора awk.Я пытался сделать сценарии awk-независимыми, но я не уверен, добился ли я успеха или нет.В любом случае, было бы неплохо установить gawk из репозиториев выбранного вами дистрибутива и удалить mawk.mawk - это минималистская реализация awk, в которой отсутствует множество функций.