如何在PowerShell通过WslInterop调用WSL的ls命令时修改文件夹背景色?
嗨,我来帮你搞定这个问题!
首先得搞清楚为什么Bash里的设置在PowerShell里不生效:当你用Import-WslCommand导入WSL的命令时,这些命令其实是PowerShell创建的快捷函数,直接调用WSL里的二进制文件(比如/bin/ls),并不会启动完整的Bash shell,自然也就不会加载你.bashrc里的环境变量配置——这就是背景色又回来的原因。
下面给你几个可行的解决方案,你可以根据自己的习惯选:
方案一:直接修改PowerShell里的ls函数,让它加载Bash配置后执行
当你导入ls命令后,PowerShell里会生成一个同名函数。你可以修改这个函数,让它通过Bash来执行ls,这样就能用上你.bashrc里的LS_COLORS设置了。
- 先查看当前
ls函数的定义,确认一下:
Get-Command ls | Select-Object -ExpandProperty Definition
- 然后重新定义这个函数,比如改成这样:
function ls { wsl bash -c 'source ~/.bashrc && ls --color=auto "$@"' -- $args }
这样每次在PowerShell里调用ls,都会先加载你Bash的.bashrc配置,再执行ls命令,背景色的设置自然就生效了。
如果你不想加载整个.bashrc(比如里面有其他你不想在PowerShell里生效的配置),也可以直接在命令里指定LS_COLORS:
function ls { wsl bash -c 'export LS_COLORS="$LS_COLORS:ow=1;34:tw=1;34:" && ls --color=auto "$@"' -- $args }
方案二:在PowerShell配置文件里设置环境变量,让WSL继承
你也可以在PowerShell的配置文件(就是你导入WslCommand的那个$PROFILE文件)里,先设置好LS_COLORS环境变量,再导入命令:
# 先设置和Bash里一样的LS_COLORS $env:LS_COLORS = "$env:LS_COLORS:ow=1;34:tw=1;34:" # 再导入WSL命令 Import-WslCommand "apt", "cat", "awk", "nano", "find", "grep", "head", "less", "man", "sed", "seq", "ssh", "sudo", "tail", "touch", "ls"
不过这个方法的前提是WSL会继承PowerShell的环境变量,有些情况下可能会有兼容性问题,你可以先试试,如果不行再换方案一。
方案三:创建专门的WSL配置文件给WslInterop用
如果你想把WslInterop的配置和日常Bash的配置分开,可以在WSL里创建一个专门的配置文件,比如~/.wsl_interoprc,内容就是你的LS_COLORS设置:
export LS_COLORS="$LS_COLORS:ow=1;34:tw=1;34:"
然后在PowerShell里修改ls函数,加载这个配置文件:
function ls { wsl bash -c 'source ~/.wsl_interoprc && ls --color=auto "$@"' -- $args }
这样既不会影响你日常Bash的配置,又能让WslInterop调用的ls用上自定义的颜色设置。
备注:内容来源于stack exchange,提问作者fmotion1

