I found a script which used this "trick" to achieve a toggle between running and printing commands:

rm_cmd="rm file1 file2"
$echo_prefix $rm_cmd

This allows the user to dry run the script and then set echo_prefix="" to effectively run the script.

Still, I found many problems related to globbing and quoting so I was looking for a different and more robust approach.

  • Mm, what are the problems with globbing and quoting? Do you want to see e.g. globs and variables expanded in the output? (that's what the echo would do.) – ilkkachu Jan 12 '18 at 14:50
  • Related to that, what should the "dry-run" mode do with command substitutions? They're commands in itself and might have effects, but they also affect the main command line, so should they be executed? – ilkkachu Jan 12 '18 at 15:18

The best approach for this is using | bash.

So basically, you just echo your command. Here in my example rm file1 file2 and then | bash will run the output.

[ws] user ~ >echo "rm file1 file2"
rm file1 file2
[ws] user ~ >echo "rm file1 file2" | bash
rm: cannot remove ‘file1’: No such file or directory
rm: cannot remove ‘file2’: No such file or directory

@Kusalananda, If you have space in file name, you just have to adapt the first part to keep the quotes in the echo command:

echo "rm \"file with space\"" | bash
  • Try that with rm "file with space in name"... – Kusalananda Jan 12 '18 at 13:15
  • You just have to adapt the first part: echo "rm \"file with space\"" | bash – Kevin Lemaire Jan 12 '18 at 13:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.