![](/img/trans.png)
[英]Calling bash script from ant in (linux) and (cygwin on windows)
[英]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. 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版本。 我對此的想法是,有什么好辦法嗎?
我相信我已經成功創建了一個批處理+ 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格式創建一個宏文件,如下所示:
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.