?

Log in

No account? Create an account
   Journal    Friends    Archive    Profile    Memories
 

Unix question - morfizm


Mar. 21st, 2011 02:39 pm Unix question

If output of an executable I control is already being redirected, how can I redirect it back to the terminal? Say, in case of a bash script?

Trying to make vimdiff work with perforce resolve. It works with "p4 diff", but doesn't with "p4 resolve", because resolve is piping $P4DIFF somewhere (I guess, to "less"). When output is redirected, vimdiff doesn't work, prints garbage and freezes the terminal.

12 comments - Leave a commentPrevious Entry Share Next Entry

Comments:

From:kot_begemot
Date:March 21st, 2011 09:42 pm (UTC)
(Link)
man 1 tee
From:morfizm
Date:March 21st, 2011 10:32 pm (UTC)
(Link)
I know tee, but I don't see how I can use it in my scenario.

p4 resolve calls:
$P4DIFF file1 file2 | less

In case where $P4DIFF is vimdiff, it fails, because vimdiff doesn't work with redirection.

I want to write my own wrapper script, where I would call vimdiff in some other way, forcing it to output back to the terminal.

Any ideas?

Calling vimdiff >/dev/stdout doesn't work. It's still screwed.
From:dennyrolling
Date:March 21st, 2011 11:02 pm (UTC)
(Link)
http://www.perforce.com/perforce/doc.current/manuals/cmdref/resolve.html не упоминает p4diff

может это какой-то у вас странный скрипт запускается?
From:morfizm
Date:March 21st, 2011 11:21 pm (UTC)
(Link)
Когда конфликты, ты можешь нажать "d (diff)" интерактивно, и тогда запускается diff tool.
From:dennyrolling
Date:March 21st, 2011 11:34 pm (UTC)
(Link)
а, я наверное никогда не нажимал :) я сразу жму e и правлю по живому
From:morfizm
Date:March 21st, 2011 11:22 pm (UTC)
(Link)
Кстати, описанное мной извращение не решает проблему, т.к. vim-у не нравится, когда input redirected тоже.

Единственный оставшийся вариант (извращение #2), который мне приходит в голову - это во враппере над p4 запустить скрипт отдельным процессом, который будет ждать сигнала и в нужный момент запустит vimdiff, но уже без всяких redirections.

From:birdwatcher
Date:March 22nd, 2011 02:22 am (UTC)
(Link)
А почему p4 resolve вызывает именно это? Бывает полезно понять, где это сконфигурировано (вряд ли вкомпилировано в бинарник), и плясать оттуда.
From:morfizm
Date:March 22nd, 2011 02:27 am (UTC)
(Link)
Я уже дошёл до того, что p4 вызывает:
$P4DIFF file1 file2 | $PAGER
Т.е. подделывать less очень легко.
Текущий солюшн - заменить $P4DIFF на echo и $PAGER на скрипт, который вызывает xargs vimdiff.

Проблема остаётся с тем, что vim в этом случае портит настройки терминала. Но их можно частично восстановить с помощью reset -Q, а полностью уже через saved=`stty -g` / stty $saved. Но stty не работает, когда есть redirect на input, поэтому это можно сделать только во wrapper'е над p4.

Короче, извращённо, но работает.
В p4 нету документированного конфига, где можно поменять поведение diff'а, вызываемого из resolve, а сам p4- бинарник. Так что ковыряться и искать эти настройки - это болото.
From:birdwatcher
Date:March 22nd, 2011 02:41 am (UTC)
(Link)
тогда
export PAGER='vim -'
From:morfizm
Date:March 21st, 2011 10:44 pm (UTC)
(Link)
Just got a nice idea: I can make $P4DIFF just print parameters to output, and make a wrapper over p4 which would fake "less" command. A faked less would read arguments and then call vimdiff.

This is so perverted, but I guess it should work.
Is there a non-perverted way of doing it?
From:ygam
Date:March 22nd, 2011 05:39 am (UTC)
(Link)
Вы меня опередили.
From:morfizm
Date:March 22nd, 2011 05:42 am (UTC)
(Link)
Дык, а что делать-то с этим tee?