# One-liner Bash function to compare the content of two variables like git diff
The issue you're encountering is that `git diff --no-index` has limitations with process substitution on certain systems (particularly Windows/Git Bash). Here's a clean solution using regular `diff` with colors:
```bash
gdiffvars() { diff --color -u <(printf "%s\n" "$1") <(printf "%s\n" "$2"); }
```
**Usage Example:**
```bash
BEFORE="$(git config --global --list)"
# ...run your git commands here...
AFTER="$(git config --global --list)"
gdiffvars "$BEFORE" "$AFTER"
```
**Explanation:**
- `gdiffvars` uses `diff --color -u` to show differences between two variables in a unified, color-highlighted format similar to Git.
- The variables' contents are safely passed using process substitution with `printf`, ensuring multi-line data is compared correctly.
- This works in bash and other shells supporting process substitution.
**Why `git diff --no-index` fails with process substitution:**
As mentioned in the existing answer, this is a known limitation on Windows/Git Bash where process substitution creates file descriptors that `git diff` cannot properly access. The error "Could not access '/proc/2219/fd/63'" occurs because Git's implementation doesn't handle these virtual file descriptors the same way regular `diff` does.
**Notes:**
- `git diff` expects files or repository paths. To compare arbitrary data in variables, use `diff` as shown above.
- The `--color` flag provides the familiar Git-like colored output you're looking for.
- The function will work on most Unix-like systems, including Linux and macOS. For native Windows, use WSL or Git Bash for best results.
- Using `printf "%s\n"` instead of `echo` ensures proper handling of variables containing backslashes or other special characters.
This approach gives you the visual familiarity of `git diff` while being more reliable across different systems and shell environments.