emacs: standard input is not a TTY
Posted on Tue 04 April 2017 in blog
Did you ever tried something like :
$ find -name '*.c' | xargs emacs
or
$ grep -rl snmp . | xargs emacs
and got the error "emacs: standard input is not a tty" ? That's normal, as the stdin for emacs is here the pipe, not your tty, you need a workaround to leave the normal stdin to your emacs. There are different approches, the one I used for a long time was a command substitution :
$ emacs $(find -name '*.c')
But other approches exists, redirecting /dev/tty to emacs' stdin :
$ find -name '*.c' | xargs sh -c 'emacs "$@" < /dev/tty' emacs
And if you are searching for a specific pattern with grep, you should want to jump directly to the right line using the '+line file' syntax of emacs, and the shell substitution :
$ emacs $(grep -rn snmp services/ | sed -r 's/([^:]*):([0-9]*):.*/+\2 \1/g')
It's good while having only one occurence of the pattern in each file, but if many occurences exists, the file is oppened only once, with a while you can open one emacs for each occurence of the searched pattern and the /dev/tty redirection :
$ grep -rn snmp services/ | sed -r 's/([^:]*):([0-9]*):.*/+\2 \1/g' | while read line file; do emacs $line $file < /dev/tty; done