О составе команды Linux - PullRequest
       40

О составе команды Linux

2 голосов
/ 24 января 2010

Предполагая, что:

  1. путь к файлу f равен ~ / f
  2. "который f" показывает "~ / f",

Тогда

which f | cat показывает ~/f. Так что cat здесь применяется к цитате ~/f, которая отличается от cat ~/f.

У меня вопрос: как я мог бы использовать одну команду, состоящую из which и cat, для достижения результата cat ~/f? Когда я не знаю результат which f заранее, использование этой композиции может быть очень удобным. В настоящее время, если я заранее не знаю результат which f, мне нужно сначала вызвать which f и скопировать и вставить результат в фид less.

Смежный вопрос: как я могу присвоить результат which f переменной?

Большое спасибо!

Ответы [ 7 ]

2 голосов
/ 24 января 2010

Попробуйте:

cat `which ~/f`

По смежному вопросу:

foo=`which ~/f`
echo $foo
1 голос
/ 24 января 2010

cat "`which f`"

0 голосов
/ 24 января 2010

cat выводит содержимое файлов на стандартный вывод. Когда вы пишете stuff | cat, файл cat работает со стандартным входом, который подключен к выходу stuff (потому что каналы - это файлы, как почти все остальное в unix).

Там нет цитирования в том смысле, что программист на lisp будет использовать слово.

0 голосов
/ 24 января 2010

В which f | cat программа cat получает вывод which f на стандартный ввод. Затем он просто пропускает этот стандартный ввод, поэтому результат такой же, как у простого which f. В вызове cat ~/f данные передаются в качестве параметра в команду. cat затем открывает файл ~/f и отображает его содержимое.

Чтобы получить вывод which f в качестве параметра для cat, вы можете, как уже отвечали другие, использовать обратные метки или $():

cat `which f`
cat $(which f)

Здесь оболочка берет вывод which f и вставляет его в качестве параметра для cat.

0 голосов
/ 24 января 2010

В bash вы можете использовать:

cat "$(which f)"

для вывода содержимого f, найденного which.Это, как и решение backtick, принимает вывод команды в $(...) и использует его в качестве параметра для команды cat.

Я предпочитаю $(...) методу backtick, так как первый можетбыть вложенным в более сложные ситуации.

Назначение переменной which для переменной выполняется аналогично:

full_f="$(which f)"

В обоих случаях лучше использовать кавычки в случае f, или его путь, содержит пробелы, столь же отвратительные, как это преступление: -)

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

vim $(find . -type f -name Makefile)

, который даст мне один сеанс vim для всех make-файлов (очевидно, если бы их было много, я бы использовал sed или perl для их изменениямассово вместо vim).

0 голосов
/ 24 января 2010

То, что вы хотите:

cat `which f`
0 голосов
/ 24 января 2010

Как и в bash:

cat "$(which f)"
var="$(which f)"
...