Из-за ненужного cd $PWD ты себе только создаёшь проблемы, повторяю, не нуже он, ты уже перед вызовом скрипта перешёл в нужную тебе директорию, теперь достаточно проста вызывать ls, т.е. оставить скрипт вот таким:
#!/bin/bash
ls -R -l -a>./dir.txt
А ещё можно вообще без скрипта обойтись, в Linux есть alias`ы, вместо скрипта можно написать alias:
alias print_dir='ls -R -l -a>./dir.txt'
Всё, теперь при наборе команды print_dir, а по факту вызове alias`а будет вызываться команда ls с параметрами.
И можно теперь делать вот так:
cd /target_dir
print_dir
всё, создастся файл dir.txt с содержимым.
Что бы alias`ы создавались даже после перезагрузки их можно пропиать в ~/.bash_rc или ~/.bash_profile или системный bashrc в /etc.
пофиг, я про $PWD и про то, что скрипт можно дёргать из другого скрипта/десктоп-файла и вот тогда без указания полного пути и не запустится какой-нибудь говнобинарь