Enquanto outras respostas podem estar corretas em afirmar que você não pode receber entradas de shell "não interpretadas" através dos meios que elas mencionam, elas estão erradas em negá-las categoricamente como uma possibilidade. Você certamente pode recebê-lo antes que o shell o interprete, se você instruir o shell a não interpretá-lo. O humilde POSIX heredoc
torna isso simplesmente possível:
% sed -e 's@\@/@g' -e 's@\(.\):\(.*\)@/drive/@' <<'_EOF_'
> c:\some\stupid\windows\place
> _EOF_
/drive/c/some/stupid/windows/place
EDIT1:
Para passar essa string para uma função shell como um argumento shell, você precisará armazená-la em uma variável shell. Geralmente você não pode simplesmente var=<<'HEREDOC'
infelizmente, mas o POSIX especifica o argumento -r
para o read
builtin:
% man read
POSIX PROGRAMMER'S MANUAL
...
By default, unless the -r option is specified, backslash ( '\' ) shall act as an escape character, as described in Escape Character (Backslash) . If standard input is a terminal device and the invoking shell is interactive, read shall prompt for a continuation line when:
The shell reads an input line ending with a backslash, unless the -r option is specified.
A here-document is not terminated after a new line is entered.
Quando combinados, read
e heredoc
tornam isso um assunto trivial e portátil também, embora não pareça muito intuitivo no início:
% _stupid_mspath_fix() {
> sed -e 's@\@/@g' -e 's@\(.\):\(.*\)@/drive/@' <<_EOF_
>> ${1}
>> _EOF_
> }
% read -r _stupid_mspath_arg <<'_EOF_'
> c:\some\stupid\windows\place
> _EOF_
% _stupid_mspath_fix ${_stupid_mspath_arg}
/drive/c/some/stupid/windows/place
EDIT2:
Provavelmente você notou a diferença entre os dois heredocs
no segundo exemplo. O terminador heredoc
_EOF_
dentro da função é sem aspas, enquanto o alimentado para read
é citado com aspas simples. Dessa maneira, o shell é instruído a executar a expansão no heredoc
com um terminador sem aspas, mas não deve fazê-lo quando seu terminador é citado. Ele não quebra ao expandir o heredoc
não-referenciado na função porque o valor da variável que ela expande já está definido como uma string entre aspas e não é analisado duas vezes.
Provavelmente, o que você deseja fazer envolve canalizar o caminho do Windows da saída de um comando para a entrada de outro dinamicamente. A substituição de comandos dentro de um heredoc
torna isso possível:
% _stupid_mspath_fix() {
> sed -e 's@\@/@g' -e 's@\(.\):\(.*\)@/drive/@' <<_EOF_
>> ${1}
>> _EOF_
> }
% read -r _stupid_mspath_arg <<'_EOF_'
> c:\some\stupid\windows\place
> _EOF_
% _stupid_mspath_fix ${_stupid_mspath_arg}
/drive/c/some/stupid/windows/place
% read -r _second_stupid_mspath_arg <<_EOF_
> $(printf ${_stupid_mspath_arg})
> _EOF_
% _stupid_mspath_fix ${_second_stupid_mspath_arg}
/drive/c/some/stupid/windows/place
Então, basicamente, se você puder produzir com segurança as barras invertidas de algum aplicativo (usei printf
acima), em seguida, executar esse comando em $(...)
e incluí-lo em um heredoc
sem aspas passado para outro aplicativo que possa aceitar com confiança o barras invertidas como entrada (como read
e sed
acima) irão ignorar completamente a análise das barras invertidas do shell. Se os aplicativos podem ou não lidar com as barras invertidas como entrada / saída é algo que você terá que descobrir por si mesmo.
Não é estritamente relevante para a pergunta:
Na resposta de Gilles, ele recomenda a forma de expansão do parâmetro ${var/search/replace}
, que, embora legal, não é POSIX. É definitivamente um basismo. Não importaria para mim, mas em suas edições ele reteve o nome da função posix ()
, e isso pode ser enganoso para alguns.
Nessa nota, a função posix ()
da postagem original faz uso do muito conveniente argumento de sed -r
da regex estendida, mas isso também não é, infelizmente, POSIX. POSIX não especifica um argumento de expressão regular estendido para sed
, e seu uso é, portanto, possivelmente não confiável.
Minha conta no estouro da pilha também tem apenas alguns dias, mas eu postei algumas respostas lá lidando especificamente com a expansão do parâmetro POSIX que você pode encontrar vinculado a partir da minha página de perfil, e no qual incluo citações das diretrizes do POSIX e seus links. Você também encontrará algumas em que eu demonstro outros usos do heredoc
, como ler um script de shell inteiro em uma variável de shell, analisá-lo e manipulá-lo programaticamente e finalmente executar sua nova versão, tudo feito de outro script ou shell função. Apenas dizendo.