3 ms·
pbpaste and pbcopy never really occur in ambiguous situations, so I wrote the following shell script: function clip { [ -t 0 ] && pbpaste || pbcopy } This i
by rjeli 11y ago
pbpaste and pbcopy never really occur in ambiguous situations, so I wrote the following shell script:
function clip { [ -t 0 ] && pbpaste || pbcopy }
This is easier to type and allows for the following:
% echo hello | clip
% clip
hello
- imahorse 11y agoWow, that's really useful. For everyone who is as bad as me in bash, to actually use it put it like this in your bashrc: function clip() { [ -t 0 ] && pbpaste || pbcopy }
- JonahBraun 11y agoI think you posted this because pasting the OP results in a syntax error. The problem is actually the list in the compound command needs to be terminated with a newline or semicolon. Both of the following are equivalent correct oneliners: clip() { [ -t 0 ] && pbpaste || pbcopy;} function clip { [ -t 0 ] && pbpaste || pbcopy;}
- kbd 11y ago> function clip { [ -t 0 ] && pbpaste || pbcopy } That's great! Would you please explain why that works? Are there any cases you know of where that doesn't work as expected? Edit: btw you need a semicolon after pbcopy to make that function valid on one line.
- godDLL 11y agoI'm not the OP, but I'll give it a go. `[` is a Bash built-in command also known as `test`. The `-t` parameter tells it to test if a file descriptor is open for `0`, which is also known as `STDIN`. So if you're piping something into `STDIN` it will do `pbcopy`. If not -- it will do `pbpaste`.
- djeikyb 11y agofrom `man test`: -t FD file descriptor FD is opened on a terminal FD 0 is stdin I'd guess. Pretty clever!
- mhouse 11y agoIn light of the recent interest in fish shell, the equivalent in fish is: function clip if not tty >/dev/null pbcopy else pbpaste end end