Я пытаюсь создать процесс из nodejs с созданием из child_process. Но команда, которую я пытаюсь запустить, является псевдонимом внутри файла .bashrc работающего пользователя.
// index.ts or whatever
import { spawn } from "child_process";
spawn('cmdAlias', [args], {
env: process.env,
stdio: 'inherit',
shell: '/bin/bash'
});
// .bashrc
[...]
alias cmdAlias='echo foo'
Это не работает, выдает команду не найдена (cmdAlias).
Если я попытаюсь перенастроить bash вручную, запустив:
// index.ts or whatever
import { spawn } from "child_process";
spawn('source $HOME/.bashrc; cmdAlias', [args], {
env: process.env,
stdio: 'inherit',
shell: '/bin/bash'
});
Затем я получаю, что исходная команда не найдена!
Есть ли способ создать процесс с загруженными псевдонимами?
(обратите внимание, что псевдоним работает с терминала, это само собой разумеющееся)
PS: упрощенные примеры здесь
Я попробовал эти шаги в своей ОС, и это сработало:
nano ~/.bashrc
alias cmdAlias='echo foo'
к .bashrc
// ./cmdAliasWrapper
#!/bin/bash
echo "Running cmdAliasWrapper.sh"
bash -i -c "cmdAlias $*"
exit 1
// ./test.js
const spawn = require('child_process').spawn;
const args = [
"echo 'This ran from test.js'"
];
spawn('./cmdAliasWrapper.sh', args, {
env: process.env,
stdio: 'inherit',
shell: '/bin/bash'
});
chmod +x ./cmdAliasWrapper.sh
node ./test.js
Теперь вы должны увидеть это на своей консоли:
Running cmdAliasWrapper.sh
echo foo This ran from test.js
Обновлено: мы можем выполнить ту же операцию без файла .sh:
// ./test.js
const spawn = require('child_process').spawn;
const args = [
"-i",
"-c",
"cmdAlias 'This ran from test.js'"
];
spawn('bash', args, {
env: process.env,
stdio: 'inherit',
shell: '/bin/bash'
});
Удалите source $HOME/.bashrc
. Ничего полезного не делает. .bashrc будет получен в любом случае, так как вы вызываете bash с помощью -i
.
@user1934428 user1934428 А, хорошо. Спасибо за внимание. я обновлю свой ответ
На самом деле, в вашей обертке, если вы напишете sheebang как #!/bin/bash -i
, вам даже не нужно создавать внутри еще один bash. -i
читает .bashrc и включает расширение псевдонима.
Что ж, да, это сработает... но мне потребуется сделать хаки и/или скопировать файл .sh (я использую машинописный текст и хочу его упаковать)... поэтому я ищу из коробочное решение Если возможно.
@ user1934428 Это правда! @TazGR Вы можете выполнить ту же операцию без файла .sh
. Пожалуйста, смотрите мой ответ.
Просто к вашему сведению: в StackOverflow вы можете (если это не было недавно изменено) уведомлять в комментарии только одного пользователя с помощью «@». Если вы хотите отправлять уведомления двум пользователям, вам нужно как-то написать два комментария. Мне это не нравится, но так устроен этот сайт.
Я получаю, что исходная команда не найдена! В вашем PATH нет исполняемого файла с именем
source
. Помимо этого, расширение псевдонима отключено по умолчанию для неинтерактивного bash. Если вам это нужно в сценарии оболочки, вы можете включить его с помощьюshopt -s expand_aliases
.