Каков порядок выполнения команд в bash? - PullRequest
0 голосов
/ 04 апреля 2020

Я сделал небольшую команду, которая должна cd меня перевести в подкаталог с именем текущей даты, и, если такого каталога не существует, сначала создаем его:

cd $(date +%F) || (mkdir $(date +%F); cd $(date +%F);)

Он корректно работает с уже существующим каталогом, но когда каталог не существует, он создает каталог, но не cd:

luk45s5@DESKTOP:~/test$ ls                                                                          
luk45s5@DESKTOP:~/test$ cd $(date +%F) || (mkdir $(date +%F); cd $(date +%F);)                      
-bash: cd: 2020-04-04: No such file or directory                                                            
luk45s5@DESKTOP:~/test$ ls                                                                          
2020-04-04

В чем проблема, как мне исправить Это? Я использую Ubuntu WSL, если это поможет.

1 Ответ

2 голосов
/ 04 апреля 2020

В чем проблема, как это исправить?

В случае сбоя cd будет выполнена следующая команда mkdir и cd, но из-за подоболочки после выхода из скрипта / команды вы окажетесь в том же каталоге, где вы начали сценарий / команды.

Вы можете использовать al oop.

until cd "$(date +%F)" 2>/dev/null; do
  mkdir -p "$(date +%F)"
done

В вашем примере вы можете использовать группирование команд, используя { }

cd $(date +%F) 2>/dev/null || { mkdir $(date +%F) && cd $(date +%F) ; }
  • 2>/dev/null перенаправляет сообщение об ошибке на /dev/null
...