29

In linux it is possible t do this:

git diff $(git status -s -b | sed -n '2p' | cut -d' ' -f2-)

or a simpler case

ls $(pwd) 

The question is how can I achieve the same in windows? (not using a batch file, a one liner in command prompt). Not all commands support piping so how can we evaluate one and pass result as parameter to another?

I've tried piping and < and > but none work.

git diff < (git status -s -b | sed -n '2p' | cut -d' ' -f2-) 

Try that yourself it expects a file. And | doesn't work either as git diff doesn't support it

git status -s -b | sed -n '2p' | cut -d' ' -f2- | git diff // results in illegal seek
aschipfl
  • 33,626
  • 12
  • 54
  • 99
Arijoon
  • 2,184
  • 3
  • 24
  • 32

1 Answers1

38

There is no $ operator in cmd.
Redirection operators (<, >, >>) expect files or stream handles.
A pipe | passes the standard output of a command into the standard input of another one.

A for /F loop however is capable of capturing the output of a command and providing it in a variable reference (%A in the example); see the following code:

for /F "usebackq delims=" %A in (`git status -s -b ^| sed -n '2p' ^| cut -d' ' -f2-`) do git diff %A
aschipfl
  • 33,626
  • 12
  • 54
  • 99
  • This is exactly what I was looking for. Update `for for /F "usebackq delims=" %A in (\`git status -s -b ^| sed -n '$1p' ^| cut -d" " -f3\`) do git diff %A $2 $3 $4` ($n is command line arguments for this alias) and it'll diff the right file by number from `git status` output – Arijoon Apr 05 '17 at 09:21
  • 39
    Everything is so simple in linux – Patrick Michaelsen Nov 26 '18 at 04:51
  • 4
    @PatrickMichaelsen I just spent better part of an hour on a 3 line BASH script because (1) `alias` just don't work in a shell script, (2) if you assign the output of a command to a variable with `var=$(cmd)` and that output has JSON in it, then the JSON gets mangled. So maybe we can agree that both BASH and WINBAT suck? :) – bigjosh Jun 12 '21 at 20:18