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

4

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

Это просто с:

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.

(Те же самые результаты с расширением 'new' $ ().)

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

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

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

Благодарю.

Джо Фручи
источник

Ответы:

3

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

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

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

tail $FILE | cut -c -$size
Яап Элдерни
источник
1

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

tail $FILE | cut -c -$COLUMNS
Брэд Сзонье
источник