Warpä¸èªå®ä¹Git Bashè·¯å¾æå | AIçæåç¿»è¯
æ ¹æ®ä»£ç ï¼ä»¥ä¸æ¯çæ¡ï¼
Warpï¼Windowsï¼ä¸ Git Bash çèªå®ä¹å¯æ§è¡è·¯å¾
è·¯å¾åé符ï¼ä½¿ç¨ \ï¼åææ ï¼
æ¥èª app/src/util/path.rs:97 ä¸ç resolve_executableï¼
if command.contains(path::MAIN_SEPARATOR) {
let path = Path::new(command);
return file_exists_and_is_executable(path).then_some(Cow::Borrowed(path));
}
å¨ Windows ä¸ï¼path::MAIN_SEPARATOR æ¯ \ãä»£ç æ£æ¥ä½ çè¾å
¥æ¯å¦å
嫿ä½ç³»ç»åé符ï¼ä»¥å³å®æ¯å°å
¶è§ä¸ºç´æ¥è·¯å¾è¿æ¯è¿è¡ PATH æ¥æ¾ãå æ¤è¯·ä½¿ç¨ï¼
C:\Program Files\Git\usr\bin\bash.exe
æ£ææ / ä¸ä¼è¢«è¯å«ä¸ºè·¯å¾åé符ï¼èæ¯ä¼è§¦å PATH æ¥æ¾ï¼å¯¹äºå C:/Program Files/... è¿æ ·çç»å¯¹è·¯å¾ï¼æ¥æ¾ä¼å¤±è´¥ï¼ã
--login -i åæ°ï¼Warp ä¼èªå¨æ·»å
ä½ ä¸éè¦å¨èªå®ä¹è·¯å¾åæ®µä¸æå® --login -iã
æ¥èª app/src/terminal/local_tty/shell.rs:685-704 ä¸ç msys2_arguments_for_session_spawning_commandï¼
fn msys2_arguments_for_session_spawning_command(shell_type: ShellType) -> Vec<OsString> {
match shell_type {
ShellType::Bash => {
vec![
"--noprofile".to_string().into(),
"--norc".to_string().into(),
]
}
// ...
}
}
并䏿¥èª ShellStarter::initï¼ç¬¬ 79-94 è¡ï¼ï¼å½ Warp æ£æµå° Git Bash è·¯å¾ï¼éè¿ is_msys2_pathï¼æ¶ï¼å®ä¼èªå¨å建ä¸ä¸ªå¸¦æè¿äºåæ°ç MSYS2 shell å¯å¨å¨ã
对äºé MSYS2 ç bashï¼å®ä½¿ç¨ arguments_for_session_spawning_commandï¼ç¬¬ 574-605 è¡ï¼ï¼è¯¥å½æ°ç¨ -c 'exec -a bash <path> --rcfile <(echo <init_script>)' å
è£
bashã
å ³é®ç¹ï¼Warp èªè¡ç®¡çå¼å¯¼åæ°ãèªå®ä¹è·¯å¾åæ®µä» ç¨äºå¯æ§è¡æä»¶çè·¯å¾ã
å½ä½ è¾å ¥èªå®ä¹è·¯å¾æ¶ä¼åçä»ä¹
- 设置çé¢ï¼
startup_shell.rs:186ï¼ï¼è°ç¨AvailableShell::try_from(buffer_text.as_str()) - éªè¯ï¼
local_tty/shell.rs:543ï¼ï¼resolve_executableæ£æ¥è·¯å¾æ¯å¦åå¨ä¸å¯æ§è¡ - Git Bash æ£æµï¼
local_tty/shell.rs:80-94ï¼ï¼canonicalize_git_bash_pathå°Git\bin\bash.exe转æ¢ä¸ºGit\usr\bin\bash.exeï¼ç¶åis_msys2_pathæ£æ¥å®æ¯å¦ä¸º MSYS2 shell - å¦ææ£æµå° MSYS2ï¼Warp å建带æ
--noprofile --norcåæ°çShellStarter::MSYS2ï¼è䏿¯--login -iï¼ - 妿䏿¯ MSYS2ï¼Warp åå»ºå¸¦ææ å bash å¼å¯¼åæ°ç
ShellStarter::Direct
