o kernel não entende \ (barra invertida)
Se drill_file
for 'file \ with \ space', sed será executado como% sed 's/\(^X[[:digit:]]*\)[[:digit:]]\(Y[[:digit:]]*\)[[:digit:]]//' file\ with\ space
.
Primeiro, o shell clona-se e chama um membro da família execl de funções passando args com argv [0] = sed, argv [1] = s / (^ X [[: digit:]] ) [[: digit: ]] (Y [[: digit:]] ) [[: digit:]] / \ 1 \ 2 /, argv [2] = arquivo \, argv [3] = com \ e argv [4] = espaço. execl substitui shell por sed. Quando o sed começa a ser executado, ele chama open("file\ ",O_RDONLY)
e faz o mesmo para 'with \' e 'space'. O kernel passa a solicitação para fs relevantes. Fs retorna ENOENT significando que não existe tal entrada no fs. Isso é verdade porque realmente não existem tais arquivos. sed recebe o erro e exibe a mensagem de erro.
se o arquivo $ drill_file tiver sido citado, o sed obterá o nome do arquivo como 'file \ with \ space' e também não abrirá essa vez.
eval sed 's/\(^X[[:digit:]]*\)[[:digit:]]\(Y[[:digit:]]*\)[[:digit:]]//' "$drill_file"
aqui eval analisa seus args e constrói comandos e executa o comando construído. É apenas redundante e complicado, você quebra e conserta.
\ (barra invertida) de escape só é aplicável quando o shell está sendo executado. sed 's/\(^X[[:digit:]]*\)[[:digit:]]\(Y[[:digit:]]*\)[[:digit:]]//'
" $ drill_file_temp " teria sido bem-sucedido.
Isso também funciona.
sed 's/\(^X[[:digit:]]*\)[[:digit:]]\(Y[[:digit:]]*\)[[:digit:]]//' \
"$(read -p "Give relative or absolute path to the \"drill.TXT\" file: " \
drill_file_temp;echo $drill_file_temp)"