MacOSX'te -e argümanını kullanırken neden yankı "\ e" (kaçış) desteği yok


36

Yerleşik echokomut aracılığıyla ANSI çıkış dizilerini kullanarak bazı renkli metinler yazdırmaya çalıştığımda, \esağladığım dizgede bulunan çıkış dizisinin kelimenin tam anlamıyla temsil ettiği "çıkış" olarak yorumlandığı anlaşılıyor. Bu sadece Snow Leopard'da olur - aşağıdaki örnekler Leopard'da amaçlandığı şekilde çalışır.

Görünüşe göre echo, -eanahtarı \nkullanırken doğru yorumladığı için anahtarı destekliyor :

~ $ 
~ $ echo "\n"
\n
~ $ echo -e "\n"


~ $ 

Ama kullanmaya çalıştığımda şunu \eanlıyorum:

~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $ 

Dediğim gibi, Leopard’da yukarıdakiler bana "RENKLER" rengini verir.

Bunun amaçlanan bir değişiklik olmasının bir nedeni olduğunu bilen var mı? Snow Leopard'daki Bash komut dosyalarından ANSI çıkış dizilerini yazdırmak için bir geçici çözüm nasıl olur?

Leopard makinemdeki Bash kabuk sürümü 3.2.17(1)-releaseve 3.2.48(1)-releaseSnow Leopard makinemde.


1
Soru post ile çelişiyor. Sorunuzda / bin / echo komutunu kullanın, gönderim sırasında yolsuz eko kullandığınızda, büyük olasılıkla kabuğunuzun yerleşik ekosu olur.
0x89

Tabii ki - fark ettiğiniz için teşekkürler. Bunu yansıtması için soruyu düzelttim.
hasseg

Yanıtlar:


24

Neden bu argümanı desteklemediğini söyleyemem (programlayıcılara bunun hakkında soru sormanız gerekebilir). Sadece linux kutumda bunu biliyorum:

$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognized:
*emphasized text*
  \0NNN   the character whose ASCII code is NNN (octal)
  \\     backslash
  \a     alert (BEL)
  \b     backspace
  \c     produce no further output
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab

NOTE: your shell may have its own version of echo, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report echo bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report echo translation bugs to <http://translationproject.org/team/>
  • bu \ekaçışlardan bahsetmiyor
  • /bin/echognu coreutils den olduğunu söylüyor . Elma, unix sistem bileşenlerinin kaynağını zaman zaman değiştirdiğinde (örneğin, zsh'den bash'a hareket), /bin/echoLeopard ve Snow Leopard arasında bir değişiklik olup olmadığını kontrol edin . Eğer gnu ise, gnu.org'daki insanlara neden bu sekansları eklememeyi seçtiklerini sorabilirsiniz.

Geçici çözümlere gelince (bu daha ilginç): /bin/echoKullanmıyor, ancak bash'ın yerleşik echokutuları linux kutularda çalışıyor. Yerleşik yankı olmadan bir bash'a geçtilerse (veya daha da belirsiz olan bir şey), kabuğunuzun yaygın olarak bilinmeyen bir özelliğini de deneyebilirsiniz (en azından bash ve zsh'de çalışır):

$ echo $'\e[34m''COLORS'

Bu bash'ın sayfasının eşleşen kısmı:

   Words  of  the  form  $'string' are treated specially.  The word expands to string, with
   backslash-escaped characters replaced as specified by the ANSI  C  standard.   Backslash
   escape sequences, if present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the  eight-bit  character whose value is the octal value nnn (one to three
                 digits)
          \xHH   the eight-bit character whose value is the hexadecimal value  HH  (one  or
                 two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the dollar sign had not been present.

   A  double-quoted string preceded by a dollar sign ($) will cause the string to be trans
   lated according to the current locale.  If the current locale is C or POSIX, the  dollar
   sign  is  ignored.  If the string is translated and replaced, the replacement is double-
   quoted.

4
$'string'Kaçış sekansı etkin olduğunun farkında değildim , teşekkürler.
hasseg

1
\ePOSIX standardının bir parçası değildir; GNU coreutils uygulaması standart olarak genişletildi. OS X yapmadı.
Martijn Pieters


15

Mu \033hala çalışır? Değilse, umarım Ctrl + V tuşlarına basıp Escape tuşunu (eğer mac'ta bu tuşlara sahipse) komut satırında gerçek bir kontrol karakteri oluşturmak için kullanabilirsiniz (editöre bağlı olarak elbette bu şekilde çalışmaz)


5
\033\eiş yerine , teşekkürler.
hasseg

4
Sadece referans olarak, Escape karakterinin33 sekizlik değeridir .
TachyonVortex 21:13

Sadece gelecekteki okuyucu referansları için 033, sekizlik yazmanın standart bir yolu olacaktır.
ocodo

11

Kabuktaki ANSI çıkış dizilerinin basılmasının bir başka yolu da kullanmaktır /usr/bin/printf.


3
printf, kabuğunda bir şeyleri göstermenin taşınabilir yoludur. Çok yankı tadı var ...
mouviciel

6

Mevcut faydalı cevabı bazı temel bilgilerle tamamlamak için :

Vermenize Eğer çağıran echotarafından isim sadece kendi yol ile aksine - /bin/echo- Bash yürütmesini ediyoruz yerleşik ziyade dış faydasından daha.

Yerleşikler gibi yerel Bash öğelerinin davranışı genellikle Bash anlamında taşınabilir, yani Bash'i çalıştırabilen herhangi bir platformda aynı şekilde çalışması gerekir .

\emacOS'ta 3.x Bash sürümlerini etkileyen ilginç bir istisnadır (şu ana dek v10.13.5'ten (High Sierra), macOS yasal olarak eski modası olan 3.x sürümleriyle birlikte gelir).

\e(ve takma \E) gereken çalışma echo -e; Bash 2.0'daki yerleşiklere \edestek eklendi . echo, ancak açıklanamaz bir şekilde macOS'ta 3.x hisse senedi sürümünde yok.

\e does üzerinde 3.x Bash sürümlerinde çalışması diğer tür Windows üzerinde MSYS olarak platformları.

Tersine, macOS'ta 4.x Bash kurar ve kullanırsanız, \e çalışmaz .


2

POSIX’e uymaya çalışabilirler: http://www.opengroup.org/onlinepubs/9699919799/

Bölüm SEÇENEKLERİ başka şeylerin yanı sıra:

Implementations shall not support any options.

İşte, düşündüğüm malzemenin doğrudan bağlantısı: opengroup.org/onlinepubs/9699919799/utilities/echo.html
sonraki bildirime kadar duraklatıldı.

Hayır! Sayfa yazmaya devam eder: 'İlk işlenen -n ise veya işlenenlerden herhangi biri bir <backslash> karakteri içeriyorsa, sonuçlar uygulama tarafından tanımlanır.' Ayrıca, macOS yankı yorumluyor -e.
Yongwei Wu

2

Bilginize, biz sadece / bin / echo ve / usr / bin / printf \ 'e çekirdek eklerimize destek eklemek üzereyiz. C standartlarının \ e belirtmediğini unutmayın, ancak gcc, perl, bash, ksh ve tcsh bunu destekliyor


0

Terminal.app'in görüntüleme seçenekleri menüsünde, "ascii olmayan karakterlerden kurtul" ifadesinin işaretli olup olmadığını kontrol edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.