cat file > tr -d '\r' cat file > rm
cat file | tr -d '\r' # tr reads stdin cat file | xargs -d '\n' rm # rm reads arguments
You are using file redirection, but the filename is an unquoted command name. Instead of running the command and feeding data to it, this just writes to a file with the same name.
To run the command and feed data to it, determine how it gets its data:
xargsas in the second example
xargs has many pitfalls when it comes to spaces and quotes.
cat file | xargs rm will appear to work during testing, but fails for filenames like
My File.txt or
Can't_Fight_This_Feeling.mp3. The example uses the GNU extension
-d '\n' to more safely handle these names.
If you actually did want to write a file named after a command, simply quote the filename to let ShellCheck know you meant it literally and not as a command name. This does not change anything about how the script works:
# Write to a file literally named 'rm', does not try to delete anything echo "A potentially dangerous command" > "rm"
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.