Бесконечный вызов псевдонима не должен произойти - не могли бы вы открыть проблему на github.com/xonsh/xonsh/issues?
Тем временем, вот способ структурировать ваш псевдоним, который будет работать без каких-либо исправлений:
def _ls(args):
args = args[0].replace('-', '') if args else ''
if $(pwd).rstrip(os.linesep) == $DOTFILES:
$(which -s ls) @(f"-{''.join(set(args + 'aG'))}")
else:
$(which -s ls) @(f"-{''.join(set(args + 'G'))}")
aliases['ls'] = _ls
Аргумент -s
для which
пропускает разрешение псевдонима, поэтому возвращает путь к фактическому ls
исполняемому файлу. Тогда логика set
состоит в том, чтобы убедиться, что аргументы не дублируются (хотя я не уверен, что это строго необходимо).