答え1
tab-width.sh
次のスクリプトを使用できます。
#!/usr/bin/env bash
echo -ne 'a\tb' &&
echo -ne "\033[6n" # ask the terminal for the position
read -rs -d\[ _ # discard the first part of the response
read -rs -dR foo # store the position in bash variable 'foo'
foo=$(cut -d";" -f2 <<< "$foo") # discard row number
printf "\r\e[0K%d\n" $((foo - 2)) # subtract 2 for 'a' and 'b'
から適応StackOverflowへの答えです。。例:
$ tabs 10
$ ./tab-width.sh
10
$ tabs 20
$ ./tab-width.sh
20
$ tabs 3
$ ./tab-width.sh
3
このスクリプトは徹底的にテストされていませんのでご注意ください。 1と2は同じ値を返しますが、ほとんどの場合うまく動作するようです。
$ tabs 1
$ ./tab-width.sh
2
$ tabs 2
$ ./tab-width.sh
2
echo -e 'a\tb'
ただし、どちらの場合も返される出力は同じであることに注意してください。
答え2
編集する:以下は実際に私が思ったようには機能しません。コメントでこの点を指摘してくれた@4wk_に感謝します:)
使ってきた
echo $'\t' | wc -L
# typical output:
8
この目的のために。
echo $'\t'
=単一のタブ文字を印刷します。wc
= "単語カウンター"プログラム-L
=別名--max-line-length
;wc
スイッチに線の長さを計算するように指示します。タブが正しく展開されます。
私はこのアプローチが他のTTYとシェルの間で非常に移植性が高いことを知りました。移植性を向上させるために追加する唯一のことは、エコーを次のように変更することです。
echo -e "\t"
ところで本当にトマトトマトですね。