¿Cómo recibo texto de stdin en sublimetext editor? Con vim funciona así:
echo "potato potato potato" | vim -Lo mismo funciona con gedit, creando un nuevo documento con los contenidos.
Sublimetext parece comenzar a editar un archivo llamado "-" en una nueva pestaña, ¿hay algún otro truco de shell que pueda funcionar?
Suponiendo que Sublime aún no admita la apertura de STDIN, una solución sencilla es volcar la salida en un archivo temporal, abrir el archivo en sublime y luego eliminarlo. Digamos que crea un script llamado tosubl en su directorio bin de la siguiente manera:
#!/bin/bash TMPDIR=${TMPDIR:-/tmp} # default to /tmp if TMPDIR isn't set F=$(mktemp $TMPDIR/tosubl-XXXXXXXX) cat >| $F # use >| instead of > if you set noclobber in bash subl $F sleep .3 # give subl a little time to open the file rm -f $F # file will be deleted as soon as subl closes itEntonces podrías usarlo haciendo algo como esto:
$ ps | tosublPero una solución más eficiente y confiable sería usar Process Substitution si su shell lo admite (probablemente lo haga). Esto elimina los archivos temporales. Aquí está con bash:
tosubl() { subl <(cat) } echo "foo" | tosubl Estoy bastante seguro de que de alguna manera puede eliminar el uso de cat en esa función donde está transfiriendo bits de forma redundante de stdin a stdout, pero la sintaxis para hacerlo en ese contexto se me escapa en este momento.
No conozco Sublime Text, pero su problema debería ser genérico en el sentido de que se aplica a cualquier programa que acepte un nombre de archivo como argumento, pero se niega a leer desde la entrada estándar.
Afortunadamente, Bash le permite canalizar la salida estándar de un proceso a algún tipo de archivo temporal y luego pasar el nombre de ese archivo a otro proceso.
De man bash :
La sustitución de procesos se admite en sistemas que admiten canalizaciones con nombre (FIFO) o el método /dev/fd para nombrar archivos abiertos. Toma la forma de <(lista) o >(lista). La lista de procesos se ejecuta con su entrada o salida conectada a un FIFO o algún archivo en /dev/fd. El nombre de este archivo se pasa como argumento al comando actual como resultado de la expansión. Si se usa el formulario >(lista), escribir en el archivo proporcionará entrada para la lista. Si se usa la forma <(lista), el archivo pasado como argumento debe leerse para obtener la salida de lista.
Suponiendo que SomeProcess produzca una salida que le gustaría capturar en su editor:
sublimetext <(SomeProcess)o:
SomeProcess | sublimetext <(cat) Si cree que escribirá esto a mano mucho, entonces puede poner sublimetext <(cat) en un script de shell o alias.
En caso de que su sistema operativo no admita la sustitución de procesos, siempre puede especificar un archivo temporal usted mismo, por supuesto:
SomeProcess > /tmp/myoutput sublimetext /tmp/myoutputPuede encontrar vipe de moreutils útil. Si configuró EDITOR='subl --wait' , simplemente puede:
echo 'potato potato potato' | vipe