Благодаря напоминанию @forquare, я проверил конфигурацию oh-my-zsh
и обнаружил проблему: плагин safe-paste
.
После удаления safe-paste
из ~/.zshrc
вставка работает в режиме vi.
Чтобы проверить, направляется ли вывод программы в конвейер, на основе https://nodejs.org/api/fs.html#fs_class_fs_stats, вы хотите вызвать fs.fstat(FileDescriptor)
, а затем вызвать isFIFO()
для возвращенного stat
объекта (FIFO == first -in -first -out == канал или именованный канал):
$ </dev/null node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
false
$ : | node -e 'var fs=require("fs");
fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); }); '
true
В C вы должны сделать системный вызов fstat
, а затем проверить поле .st_mode
возвращенного struct stat
с помощью макроса S_ISFIFO
.
Если вам нравится тратить циклы ЦП и вы хотите использовать внешний двоичный файл, вы можете выполнить test -p /dev/fd/$THE_FD
, чтобы получить ответ (, или вызвать его в оболочке, где test
будет встроенной, или запустить stat
или запустить что-то другое, способное определить тип файла ).
Для программы возможно, и это довольно тривиально, определить, ссылается ли какой-либо заданный дескриптор открытого файла в своем процессе на канал или FIFO. Это простое упражнение по использованию библиотечной функции fstat()
.
Вам придется решить, как вызывать fstat()
на выбранном вами языке программирования.В языках C или C++ функция для этого довольно проста :
#include <sys/types.h> // no longer required by IEEE 1003.1:2008 #include <sys/stat.h> #include <unistd.h> /// \brief Check a file descriptor for being open and denoting a pipe/FIFO extern inline bool /// \returns true if and only if the descriptor is open to a pipe/FIFO is_fifo ( int fd ///< the file descriptor to test ) { struct stat s; return 0 <= fstat(fd, &s) && S_ISFIFO(s.st_mode); }
Библиотека libsystemd в systemd имеет несколько более сложную sd_is_fifo()
библиотечную функцию.
Использование Node.js во время выполнения на *nix-системе, похоже, работает:
const isTTY = process.stdout.isTTY;
если верно, то он не подключен к целевому каналу
если не определено, он подключен к целевому каналу
...по крайней мере, согласно моим исследованиям