Процесс создания NodeJS, который является псевдонимом

Я пытаюсь создать процесс из 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: упрощенные примеры здесь

Я получаю, что исходная команда не найдена! В вашем PATH нет исполняемого файла с именем source. Помимо этого, расширение псевдонима отключено по умолчанию для неинтерактивного bash. Если вам это нужно в сценарии оболочки, вы можете включить его с помощью shopt -s expand_aliases.

user1934428 18.04.2023 16:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попробовал эти шаги в своей ОС, и это сработало:

  1. выполнить nano ~/.bashrc
  2. Добавьте alias cmdAlias='echo foo' к .bashrc
  3. Теперь найдите свой проект и создайте там эти два файла.
// ./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'
  });
  1. Выполнить chmod +x ./cmdAliasWrapper.sh
  2. И, наконец, 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 18.04.2023 16:53

@user1934428 user1934428 А, хорошо. Спасибо за внимание. я обновлю свой ответ

Murat Colyaran 18.04.2023 16:56

На самом деле, в вашей обертке, если вы напишете sheebang как #!/bin/bash -i, вам даже не нужно создавать внутри еще один bash. -i читает .bashrc и включает расширение псевдонима.

user1934428 18.04.2023 17:01

Что ж, да, это сработает... но мне потребуется сделать хаки и/или скопировать файл .sh (я использую машинописный текст и хочу его упаковать)... поэтому я ищу из коробочное решение Если возможно.

TazGR 18.04.2023 17:09

@ user1934428 Это правда! @TazGR Вы можете выполнить ту же операцию без файла .sh. Пожалуйста, смотрите мой ответ.

Murat Colyaran 18.04.2023 17:16

Просто к вашему сведению: в StackOverflow вы можете (если это не было недавно изменено) уведомлять в комментарии только одного пользователя с помощью «@». Если вы хотите отправлять уведомления двум пользователям, вам нужно как-то написать два комментария. Мне это не нравится, но так устроен этот сайт.

user1934428 18.04.2023 17:19

Другие вопросы по теме