为何Shell脚本执行zsh --login后yarn start无法运行?
问题原因及解决方案
问题原因
你的脚本里,env /usr/bin/arch -x86_64 /bin/zsh --login会启动一个全新的x86_64架构的zsh登录shell进程。原脚本会暂停执行,直到这个新shell被你手动退出(比如输入exit)之后,才会继续运行后面的yarn start——但这时候你已经退出了x86_64环境,而且之前的目录切换是在原脚本进程中完成的,新shell默认不会继承这个切换后的目录。
而拆分两个别名执行时,你是先通过intel启动新的x86_64 zsh,然后在这个新shell内部执行abudget,所以cd和yarn start都是在x86_64环境下运行的,自然能正常执行。
修复方法
要让所有命令在同一个脚本里生效,需要让新启动的x86_64 zsh直接执行cd和yarn start命令,而非启动交互式shell。以下是两种可行方式:
方式1:将命令作为参数传给zsh
修改脚本为:
#!/bin/sh env /usr/bin/arch -x86_64 /bin/zsh --login -c "cd /Users/tillman/t-root/dev/apps/actual-server && yarn start"
-c参数让zsh执行引号内的命令,执行完成后自动退出新shell。
方式2:使用Here Document( heredoc)
如果命令逻辑复杂,可通过heredoc传递命令给zsh:
#!/bin/sh env /usr/bin/arch -x86_64 /bin/zsh --login << 'EOF' cd /Users/tillman/t-root/dev/apps/actual-server yarn start EOF
<< 'EOF'表示将后续到EOF的内容作为输入传给zsh执行,单引号可避免原shell解析内部变量。
内容的提问来源于stack exchange,提问作者tjex
相关产品推荐
相关产品推荐

