Я хочу запустить эту команду:
ls -arth Test*log | tail -1
... и передать свой вывод в качестве аргумента:
open /Applications/Utilities/Console.app <previous output>
Я хотел бы сделать все это в одну строку.
Я хочу запустить эту команду:
ls -arth Test*log | tail -1
... и передать свой вывод в качестве аргумента:
open /Applications/Utilities/Console.app <previous output>
Я хотел бы сделать все это в одну строку.
Это называется заменой команды:
open /Applications/Utilities/Console.app "$(ls -arth Test*log | tail -1)"
Если вы уверены, что вывод команды, которую вы подставляете, не будет содержать пробелы или переводы строк (или если вы хотите предоставить разделенный пробелами / символами новой строки вывод в качестве нескольких аргументов), вы можете опустить кавычки:
open /Applications/Utilities/Console.app $(ls -arth Test*log | tail -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