标题: 请问为什么下面的linux命令不能生效?
时间: 2022-08-16发布,2022-08-16修改
通过编程方式启动一个子进程,临时更改用户python命令的指向。
所以我想到了别名方式。想临时覆盖用户原有的python命令
$ alias python=python2;python --version
显示python ,找不到该命令。
不关闭shell,下一行输入lll ,别名是可以生效的。
但是 并不能做到我一条命令临时覆盖lll的命令。
『回复列表(21|显示机器人聊天)』
Bash 手册里,Alias 条目说:
Bash always reads at least one complete line of input, and all lines that make up a compound command, before executing any of the commands on that line or the compound command. Aliases are expanded when a command is read, not when it is executed. Therefore, an alias definition appearing on the same line as another command does not take effect until the next line of input is read. The commands following the alias definition on that line are not affected by the new alias.
大意:
Bash 总是至少读取完整的一行(或多行,保证复合命令也读完整咯),接着立即扩展别名,最后再执行命令
另外,你的ls -ll
需要用引号括起来,否则-ll
不是lll
的一部分,而是成为alias
的参数。如:
$ alias lll='ls -ll'
import * as child from 'child_process'
export async function execRequest(cmd: string, commands: string[]) {
return new Promise((resolve) => {
let spawnChild = child.spawn(cmd)
spawnChild.stdout.on('data', ch => {
console.log(ch.toString().trim())
})
spawnChild.stderr.on('data', ch => {
console.log(ch.toString().trim())
})
spawnChild.on('exit', code => {
console.log(code)
})
commands.forEach((command) => {
spawnChild.stdin.write(`${command}\n`)
})
spawnChild.stdin.end('\nexit\n')
})
}
await execRequest('bash',['alias python233=python2','python233 --version 2>&1'])
以上代码 大概意思是,输入bash,并开启交互式shell
第一次流写入alias python233=python2 并且回车
第二次流写入python233 --version 2>&1 并且回车
输出流提示
提示python233不存在
PS: python --version竟然输出到错误流 真离谱