I'm running a Node.js script that creates a child process using the spawn function from the child_process module. The child process runs the zsh shell and prompts the user to enter a name using the read command. However, I can't see the prompt message in the output of the child process.
Here's my code:
const { spawn } = require('child_process');
let child;
async function executeCommandOrSendInput(commandOrInput) {
if (!child || child.exitCode !== null) {
console.log('Creating new child process');
child = spawn('zsh', [], { stdio: 'pipe' });
child.stdout.on('data', (data) => {
console.log(`Output: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`Error: ${data}`);
});
child.on('close', (code) => {
console.log(`Child process exited with code ${code}`);
});
}
console.log('Sending command or input:', commandOrInput);
child.stdin.write(commandOrInput + '\n');
}
(async () => {
try {
await executeCommandOrSendInput('read "name?name?" ;echo $name > /tmp/thename.txt; echo done');
await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for 1 second
await executeCommandOrSendInput('my_name');
await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for 1 second
child.stdin.end(); // End the child process
} catch (error) {
console.error('An error occurred:', error);
}
})();
The output is
Creating new child process
Sending command or input: read "name?name?" ;echo $name > /tmp/thename.txt; echo done
Sending command or input: my_name
Output: done
Child process exited with code 0
I am using a strange zsh version of read which apparently puts the message before the ?.
When I run the script, I expect to see the name? prompt message in the output of the child process, but it's not there. How can I see the full output of the commands. When I run in zsh, I see:
% read "name?name?" ;echo $name > /tmp/thename.txt; echo done
name?my_name
done
The file I'm creating in the tmp directory does have the correct output