I can manually open up PowerShell and run
wsl
ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1
To get the IP address of the Ubuntu instance. But when I try to write a script for this (100 different ways) I always get some kind of error. This is an example
$command = "ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1"
$ip = Invoke-Expression "wsl $command"
Which gives an error about grep
.
CodePudding user response:
Call wsl.exe
via the -e
option and specify bash
as the executable, which allows you to use the latter's -c
option with a command line specified as a single string:
# Note the need to escape $ as `$
# to prevent PowerShell from interpolating it up front inside "..."
$command = "ip addr show eth0 | grep 'inet\b' | awk '{print `$2}' | cut -d/ -f1"
wsl -e bash -c $command
A note re the choice of string literals on the PowerShell side:
Using
"..."
quoting rather than'...'
quoting is convenient if the text contains'
characters, because it obviates the need for escaping - ditto for the inverse scenario: using'...'
quoting for text that contains"
chars.However, as in POSIX-compatible shells such as Bash, the choice of quoting character matters:
'...'
is a verbatim (single-quoted) string.- Unlike in POSIX-compatible shells, where escaping embedded
'
chars. must be emulated with'\''
, PowerShell does support direct escaping, namely with''
- Unlike in POSIX-compatible shells, where escaping embedded
"..."
is an expandable (double-quoted) string, i.e. subject to string interpolation for substrings that start with$
- Unlike in POSIX-compatible shells, where embedded
$
chars. to be used verbatim (literally) require escaping as\$
, in PowerShell you must use`$
, using`
, the so-called backtick, PowerShell's escape character.
- Unlike in POSIX-compatible shells, where embedded
CodePudding user response:
Or let's assume you have powershell installed in linux (there's no Get-NetIPConfiguration?).
$command = "ip addr show eth0 | select-string inet\b | % { (-split `$_)[1] } |
% { (`$_ -split '/')[0] }"
wsl -e pwsh -c $command
10.0.0.107
Or even without it.
wsl -e ip addr show eth0 | select-string inet\b | % { (-split $_)[1] } |
% { ($_ -split '/')[0] }
10.0.0.107