bash - Why would a correct shell script give a wrapped/truncated/corrupted error message? -
i have shell script command seems should work, instead fails odd wrapped/truncated/corrupted error message. example:
$ ls -l myfile -rw-r----- 1 me me 0 aug 7 12:36 myfile $ cat myscript ls -l myfile $ bash myscript : no such file or directory the file exist, if didn't, kind of error message get:
$ ls -l idontexist ls: cannot access idontexist: no such file or directory notice how includes tool name ls, message string , filename while mine not.
here's if try use mysql instead. error message looks it's been wrapped, , starts quote:
command: mysql -h myhost.example.com expected: error 2005 (hy000): unknown mysql server host 'myhost.example.com' (0) actual: ' (0) 2005 (hy000): unknown mysql server host 'myhost.example.com and here's trivial ssh command should work, or @ least give normal error message, instead wrapped start colon , ends strange clobbering:
command: ssh myhost expected: ssh: not resolve hostname myhost: name or service not known actual: : name or service not knownname myhost why happen, , how fix it?
tl;dr: script or data has windows style crlf line endings.
convert unix style deleting carriage returns.
how check if script or data has carriage returns?
they're detectable ^m in output of cat -v yourscript:
$ cat -v myscript ls -l myfile^m if script doesn't have them, data might -- if reading ini/csv files or curl:
hostname=$(curl https://example.com/loginhost.txt) ssh "$hostname" # shows strange error echo "$hostname" | cat -v # shows myhost^m how remove them?
set editor save file unix line endings, aka "line terminators" or "end-of-line characters", , resave it.
you can remove them command line dos2unix yourscript or cat yourscript | tr -d '\r' > fixedscript.
if found in data, can pipe source through tr -d '\r':
hostname=$(curl https://example.com/loginhost.txt | tr -d '\r') why carriage returns cause strange error messages?
the "carriage return" character, aka cr or \r, causes cursor move start of line, , continue printing there. in other words, starts overwriting line start. why wrap strangely:
intended: ssh: not resolve hostname myhost\r: name or service not known written: ssh: not resolve hostname myhost\r overwritten: : name or service not known ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ result: : name or service not knownname myhost
Comments
Post a Comment