определить общий псевдоним, работающий как в Windows, так и в Linux (Windows bash или Cygwin)? - PullRequest
0 голосов
/ 13 декабря 2018

Я использую «Командную оболочку Windows» и «Оболочку Bash» в ОС Windows 10.Что меня действительно раздражает в этом, я должен определить псевдоним для каждой оболочки (doskey и псевдоним), даже если я использую один и тот же псевдоним команды и папки.Например, псевдоним np = 'D: _MyProgram_IDEditor \ Notepad ++ \ notepad ++. Exe' doskey np = D: _MyProgram_IDEditor \ Notepad ++ \ notepad ++. Exe $ *

Поэтому я хотел бы знать, какопределить общие определения, которые будут работать в обеих оболочках. В настоящее время моя идея заключается в следующем ...

  1. определить текстовый файл общего определения
  2. создать скрипт, который читает "файл общего определения""и определите" doskey в командах "и" псевдоним в оболочке Bash ".

Есть ли хороший способ сделать это или любую другую связанную с этим работу?

Пример)

1. define common definition text file (common-define.txt)

"SET"   "DIR_PROGRAM"   "D:\OneDrive\_MyProgram"
"CD" "dev"              "D:\OneDrive\_MyProgram"
"ALIAS" "tt"            "tt.bat"


2. read it and define "doskey in commands", and "alias in shell" (autoload-batch.bat)

FOR /f "tokens=1,2,3* delims= " %%A IN ( common.define.txt
) DO (
if "%%~A"=="###"    echo %%A, %%B, %%C
if "%%~A"=="SET"    set %%~B=%%~C
if "%%~A"=="SETX"   setx %%~B %%~C
if "%%~A"=="CD"     echo @doskey %%~B=cd /d %%~C>>gen_doskey.cmd
if "%%~A"=="ALIAS"  echo @doskey %%~B=%%~C $*>>gen_doskey.cmd
)

reg add "hkcu\software\microsoft\command processor" /v Autorun /t reg_sz /d %~dp0\gen_doskey.cmd /f

это версия для Windows.и я работаю над версией Linux.Что я думаю по этому поводу? Есть ли хороший способ сделать это?

1 Ответ

0 голосов
/ 13 декабря 2018

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, в которой отсутствует множество функций.

...