-1

Я хочу запустить эту команду:

ls -arth Test*log | tail -1

... и передать свой вывод в качестве аргумента:

open /Applications/Utilities/Console.app <previous output>

Я хотел бы сделать все это в одну строку.

2 ответа2

4

Это называется заменой команды:

open /Applications/Utilities/Console.app "$(ls -arth Test*log | tail -1)"

Если вы уверены, что вывод команды, которую вы подставляете, не будет содержать пробелы или переводы строк (или если вы хотите предоставить разделенный пробелами / символами новой строки вывод в качестве нескольких аргументов), вы можете опустить кавычки:

open /Applications/Utilities/Console.app $(ls -arth Test*log | tail -1)
1

Это достаточно просто

open /Applications/Utilities/Console.app `ls -arth Test*log | tail -1`

Любая команда, включенная между серьезными акцентами, будет выполняться в новой среде bash, завершаться при выполнении и заменять себя своим результатом.

Если я выполняю простую команду "ls" с серьезными акцентами в своей домашней папке, я получаю такую ошибку:

john@ship:~$ `ls`
Desktop: command not found

Это означает, что bash пытается выполнить возвращаемое значение до правильного разделителя в качестве команды

Вот еще один пример, чтобы прояснить эту хакерскую технику:

john@ship:~$ `echo "ls -l"`
total 36
drwxr-xr-x 2 john john 4096 Jul 27 19:43 Desktop
drwxr-xr-x 2 john john 4096 Jul 27 19:43 Documents
drwxr-xr-x 2 john john 4096 Aug  2 22:04 Downloads
drwxr-xr-x 7 john john 4096 Aug  2 19:28 Music
drwxr-xr-x 2 john john 4096 Aug  2 10:49 Pictures
drwxrwxr-x 3 john john 4096 Jul 28 22:21 Projects
drwxr-xr-x 2 john john 4096 Jul 27 19:43 Public
drwxr-xr-x 2 john john 4096 Jul 27 19:43 Templates
drwxr-xr-x 2 john john 4096 Jul 27 19:43 Videos

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .