簡體   English   中英

定義在Windows和Linux(Windows bash或Cygwin)上均可使用的通用別名?

[英]define common alias working on both Windows and Linux(Windows bash or Cygwin)?

我在Windows 10 OS中使用“ Window Command shell”和“ Bash shell”。 真正讓我煩惱的是,即使我使用相同的命令和文件夾別名,我也必須為每個外殼定義別名(doskey和別名)。 例如,別名np ='D:_MyProgram_IDEditor \\ Notepad ++ \\ notepad ++。exe'doskey np = D:_MyProgram_IDEditor \\ Notepad ++ \\ notepad ++。exe $ *

因此,我想知道如何定義在兩個shell中都可以使用的通用定義。 目前我的想法是...

  1. 定義通用定義文本文件
  2. 編寫一個讀取“公共定義文件”並定義“命令中的doskey”和“ Bash shell中的別名”的腳本。

有什么好的方法或與此相關的工作嗎?

例)

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版本。 我對此的想法是,有什么好辦法嗎?

本機Linux,翻譯為doskey

我相信我已經成功創建了一個批處理+ bash多語言腳本。 使用bash shell保存此文件,以便僅以LF終止行,而不以Windows樣式的CRLF終止行。 與Windows的bash相比,cmd似乎更接受Unix樣式的行終止。

: <<'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 確實,這就是啟動新的bash會話時〜/ .bashrc和〜/ .profile的來源。 在cmd shell中,您可以只執行scriptfile.bat

精心放置Heredoc多行注釋會帶來魔力。 bash解釋器將: <<'BASH_PORTION'作為多行注釋的開頭,並將BASH_PORTION作為其結尾。 我從這個答案中得到了主意。 使用這些Heredoc注釋,bash可以被強制忽略cmd僅批處理行。 並且batch將以:開頭的任何行都視為標簽,因此第一行無效。

在誘使每個解釋器忽略了對方的命令之后,剩下的就是定義別名。 別名必須在bash端使用雙引號定義,然后可以在批處理端使用for /f循環刪除引號,並使用doskey替換alias


本機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產生了一個新的shell,該shell無法將環境更改傳遞給調用范圍。 因此,似乎需要臨時文件。


添加文件路徑轉換的示例

使用第二種方法,如果要將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解釋器。 我試圖使腳本完全不可知,但是我不確定是否成功。 無論如何,最好從所選發行版的存儲庫中安裝gawk並刪除mawk。 mawk是awk的極簡實現,缺少許多功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM