为何cdvf别名执行后无法进入目标Android/data文件夹?
问题描述
我编写了如下多行别名命令:
alias cdvf='(ID=$(id -u $USER); gvfs_uri="mtp:host=Xiaomi_Redmi_10A_IJLZKJLNNRLBSSVO/Internal shared storage/Android/data"; echo "$gvfs_uri"; dfolder="/run/user/$ID/gvfs/""$gvfs_uri"; echo "$dfolder"; cd "$dfolder")'
使用set -x跟踪运行命令后,在控制台粘贴该别名并调用cdvf,发现bash已解析执行cd '/run/user/1000/gvfs/mtp:host=Xiaomi_Redmi_10A_IJLZKJLNNRLBSSVO/Internal shared storage/Android/data'命令,但并未进入目标/Android/data文件夹;而手动复制该cd命令执行却能成功进入,请问这是什么原因?
原因分析与解决办法
- 核心原因:别名里的命令被括号
()包裹,这会让括号内的所有命令在子shell中执行。子shell拥有独立的运行环境,其中执行的cd仅会改变子shell的工作目录,当子shell执行完毕退出后,原父shell的工作目录不会发生任何变化。 - 解决办法:移除别名中的括号,让命令直接在当前shell环境中执行,修改后的别名如下:
alias cdvf='ID=$(id -u $USER); gvfs_uri="mtp:host=Xiaomi_Redmi_10A_IJLZKJLNNRLBSSVO/Internal shared storage/Android/data"; echo "$gvfs_uri"; dfolder="/run/user/$ID/gvfs/""$gvfs_uri"; echo "$dfolder"; cd "$dfolder"'
此时执行cdvf,cd命令会直接作用于当前shell,就能成功进入目标目录。
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

