[Solved] How to bind a shell command to a hotkey? (raspi2png)
-
@roslof If you post the contents of the
/etc/triggerhappy/triggers.d/raspi2png.conf
we may be able to spot any errors. -
@mitu You bet, but it really is the same as step 4 above, and it definitely works at a bash prompt:
KEY_SYSRQ 1 raspi2png --pngname "/home/pi/$(ps a | grep RetroPie/roms | awk -F "/" 'NR==1 { print $NF }' | sed 's/\.[^.]*$//g; s#\\##g')"-$(date +%Y.%m.%d-%H.%M.%S).png
Syntax-wise, this is good. It just gets cropped during parsing after the 128th character.
I did, however, figure out a work-around. I just created a separate script/.sh to run raspi2png w/all the parameters. Then I just called the script from raspi2png.conf ;-)
My work-around:
Newly added /etc/triggerhappy/triggers.d/run-raspi2png.sh ensure executable perm flag is set
raspi2png --pngname "/home/pi/$(ps a | grep RetroPie/roms | awk -F "/" 'NR==1 { print $NF }' | sed 's/\.[^.]*$//g; s#\\##g')"-$(date +%Y.%m.%d-%H.%M.%S).png
Revised /etc/triggerhappy/triggers.d/raspi2png.conf
KEY_SYSRQ 1 /etc/triggerhappy/triggers.d/run-raspi2png.sh
Edit Note: Previously posted a line that used nohup, which was non-essential. For the curious, it was: KEY_SYSRQ 1 nohup /etc/triggerhappy/triggers.d/run-raspi2png.sh 0<&- &>/dev/null &
I have to say, the command-line arguments you and Clyde created are super-creative. I never would have imagined a screen capture with proper naming, and a solution for ANY emulator, including non-Retroarch. Great work, guys!
-
removed post based on insights from mitu
-
@roslof That's not necessary on Raspbian (and RetroPie) since the
pi
user is already a member of thevideo
group and has access to/dev/vchiq
. This kind of advice (make the/dev/whatever
writable to anyone) it's just encouraging bad practice - don't do it, instead make sure your user is in the correct group. -
@mitu Helpful. I'll edit the post. Unclear why I was in this state.
-
@roslof Thanks for reporting this and for the workaround. I'll admit that I didn't test the last version of the string (note to myself: always test things before putting them online, even slight alterations of existing things).
It can't be the length (alone), though. I tested the command
echo "...1.........2.........3..."
and so on to test a string limit for command in theraspi2png.conf
, but it worked well up to the 140 characters that I tested.This is the output of
sudo systemctl status triggerhappy.service
with the last version of @mitu's string:Feb 24 09:11:54 raspi thd[1458]: Executing trigger action: raspi2png --pngname "$(ps a | grep RetroPie/roms | awk -F "/" 'NR==1 { print $NF }' | sed 's/\.[^.]*$//g; s Feb 24 09:11:54 raspi thd[1458]: sh: 1: Syntax error: Unterminated quoted string
Thanks for the compliments, I want to add @Lolonois who provided the very first part of the command string.
@mitu My knowledge about bash fu is very limited. Do you have any idea what can cause this?
-
@roslof You shouldn't have :), now my reply doesn't make any sense.
-
-
@Clyde Hm, I bet it's because it interprets the
#
as a comment start. Try thisraspi2png --pngname "/home/pi/$(ps a | grep RetroPie/roms | awk -F "/" 'NR==1 { print $NF }' | sed 's/\.[^.]*$//g; s/\\//g')"-$(date +%Y.%m.%d-%H.%M.%S).png
-
@Clyde sorry, man -- but it sounded like a sub-par solution to perms issues I was having. Since mitu advised not to follow the directions, I felt it best not to give that information to the public, in case they didn't get the warning.
-
@roslof It's ok to leave it - this way when someone googles for this advice will see that a reply with 'bad dog' has been added and think: "Hey, that's how you do it right".
-
@mitu That works! I'll update my solution with this and add a remark about @roslof's workaround in case someone wants to run a script instead of a single command. Thank you both!
edit: Just when you posted your solution, I wanted to report that changing the length by removing the whitespaces before and after the pipes didn't change the point of cutting off the line. You were faster. 😉
@roslof As @mitu said, it's better (and widely seen as more honest and polite) to leave it and maybe crossing it out and/or commenting below it that it has been wrong. Just a friendly advice. 😊
-
@roslof 's solution is also better when you just want to change something to the script command, since you don't need to re-start the
thd
service or edit the.conf
file - any edits to the.sh
file will take effect immediately. -
@Clyde Thanks man. Still new here.
-
@mitu The script version even relays the output of the script commands to triggerhappy's status output. I wasn't sure if it would do that. But I will keep it as optional for my solution post, because it adds more complexity, and one command should be enough for most people.
@roslof You're welcome! Besides, in some cases can deletion be advisable, like in this thread from me where @meleu's solution made my own completely obsolete (and wrong for many reasons). But I still added a remark about it original content. 😇
-
@roslof One question about your script variant: Is there a reason that you're using
nohup
and0<&- &>/dev/null &
? I'm asking out of curiosity and simplicity, because it seems to work as well if I just invoke the script by path and name, as do some triggerhappy guides I found online.And since I linked to your solution in mine, could you please add a remark that the script has to be made executable? (In my example for the owner "pi", or for "others" if the owner is root, since my solution configures triggerhappy to run as that user.)
-
@Clyde As requested, I added a note in my previous post about setting the executable permission.
Also, you're absolutely right about my use of nohup. It's not necessary for such a simple/quick script. nohup ensures the process doesn't stop until it's done. Overkill for the near-instant execution of the script. Again, my newbie-ness is shining through.
Regardless -- Cool write-up on nohup, its uses, and why output needs to be considered for other, longer tasks:
https://www.maketecheasier.com/nohup-and-uses/I revised my post with the simple path/script and included an edit note with my original nohup line for reference...
Cheers -
@roslof Perfect, thanks!
-
@Lolonois said in [Solved] How to bind a shell command to a hotkey? (raspi2png):
@hermit
triggerhappy
is not related to retropie. AFAIK%ROM%
or$ROM
is not available from the environment. However, to get the rom file name you may start withbasename `ps a | grep RetroPie/roms | head -1 | awk '{ print $NF }'`
Without a physical keyboard attached the tool jslisten may be an option.
This is definitly the master path for such purpose. Why it gets so less attention?
Together with the jslisten tool we can call any script and manipulate filenames (because we aren't restricted to one liners) ;)Thx @Lolonois for this nice suggestion ;)
@mitu @Clyde
The triggerhappy solution is also nice but imho the joypad usecase is a real fine way to coop with.Btw: You can always use GPIO inputs to call commands
-
@cyperghost said in [Solved] How to bind a shell command to a hotkey? (raspi2png):
Btw: You can always use GPIO inputs to call commands
If you're not like me and prefer USB connections. ;) (because, I don't know, lazyness?)
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.