Подстановка команд Bash не работает должным образом

1258
Joe Fruchey

Я хотел бы просмотреть последние несколько строк файла, но я хочу, чтобы столбцы были выровнены. По сути, я хочу отключить перенос слов.

Это просто с:

tail $FILE | cut -c -80 

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

stty size | cut -d" " -f2 

Так что я мог бы представить, что я мог бы просто

tail $FILE | cut -c -`stty size | cut -d" " -f2` 

но это не работает:

stty: standard input: Invalid argument cut: invalid range with no endpoint: - Try `cut --help' for more information. 

(Те же результаты, что и в случае с новым расширением $ ().)

Теперь, если я повторяю это, это выглядит хорошо:

echo cut -c -`stty size | cut -d" " -f2` cut -c -103 

Я просто скучаю по спасательному персонажу? Или это как-то просто невозможно?

Благодарю.

4

2 ответа на вопрос

3
Jaap Eldering

Причина, по которой он не работает, заключается в том, что sttyон выполняется внутри канала. Поэтому он не «видит» базовый терминал. В вашем скрипте вы можете хранить ширину терминала в переменной типа

size=`stty size | cut -d" " -f2` 

а затем использовать это следующее:

tail $FILE | cut -c -$size 
1
Bradd Szonye

Bash поддерживает ширину экрана в COLUMNSпеременной, которую вы можете использовать в конвейере:

tail $FILE | cut -c -$COLUMNS 

Похожие вопросы