I'm working on a script that needs to store some boilerplate code in a variable, but I'm running into issues with heredoc syntax. I want to make sure the code remains unexecuted and is stored as raw text. Here's a simple example of my code:
```
DEFAULT_PROGRAM=$(cat <<'EOF'
)
EOF
)
echo $DEFAULT_PROGRAM
```
No matter how I adjust the syntax—whether I put quotes around `EOF`, escape the parentheses, or try different combinations—I'm either getting outputs with escaping characters or I'm hitting errors like:
```
EOF: command not found
syntax error near unexpected token `)'
`)'
```
It seems like the issue is with how the outer syntax `$(cat ...)` interprets everything. Is there a more elegant way to do this without having to use echo with a lot of escaping?
4 Answers
I think the problem you're running into might have to do with the indentation of the `EOF` line in your heredoc. In bash, you can use `<<-EOF` to allow for indentation with tabs, which would strip those leading tabs. For your case, try this:
```bash
DEFAULT_PROGRAM=$(cat <<-'EOF'
)
EOF
)
echo $DEFAULT_PROGRAM
```
This way, you're not adding unnecessary spaces that might mess with your output. Just remember, if you're using `<<-`, only tabs will be stripped, so make sure no spaces are causing any issues!
I ran your script on several versions of bash, and everything worked fine for me. You might want to check if your version is updated. Also, [here's a link to an online bash tester](https://tio.run/##S0oszvj/38XVzTHUJyQ@IMjfPcjR11ZFIzmxRMHGRt3V302dS5MLSAHJ1OSMfAUlFTTFSv//AwA) that runs clean without any errors!
That's interesting! I checked the version on my machine, and it turns out I'm running bash 3.2. Maybe that's where the issue lies!
Another option is to define a function to encapsulate your code. That way, you can declare it cleanly without worrying about syntax errors affecting your variable. Here's a quick example:
```bash
default_program() {
printf 'my default prog'
}
code=$(declare -f default_program)
```
This stores your function's code as raw text, and you still get the benefit of organization!
That's a neat solution! I love how it keeps everything tidy, but I wonder if any comments will get stripped like that.
Have you thought about using a `read` command with heredoc? It's pretty clean and shouldn't give you the escaping issues you're seeing. Check this out:
```bash
read -r DEFAULT_PROGRAM <<-'EOF'
)
EOF
```
the `-r` flag helps ignore backslashes, and this method keeps it all neat within your variable!
I just tried it, and it worked perfectly! Thanks a ton! <3
That's a good catch! I didn’t realize that was a limitation. I guess `<<-` might be the way to go if you're aiming to keep your script neat!