Using tty: in shell command

  1. 2 weeks ago

    Robert W

    Nov 28 Western Canada

    I need to run a MacOS shell to call a command to process a very short snippet of text. I could save the text from my Xojo app as a text file and use that as input, but I recall that in Unix you can specify the input file as tty: and then send the text directly following the command. But when I try this in the Terminal application, it tells me "tty: not found." Is it possible to do this, and if so what is the correct syntax?

  2. Kem T

    Nov 28 Pre-Release Testers, Xojo Pro, XDC Speakers Connecticut

    As an aside, what kind of processing?

  3. Norman P

    Nov 28 Pre-Release Testers, Xojo Pro under a bus

    The Shell object in Xojo is not the same as a Terminal window you get when you open the Terminal app
    Terminal runs a pile of shell initialization code that the Shell object does not

  4. Robert W

    Nov 28 Western Canada
    Edited 2 weeks ago

    @Kem Tekinay As an aside, what kind of processing?

    I'm using pdflatex to format a math expression.

    Norman, I haven't tried this in a Xojo shell yet, just in Terminal. I figured that if I could get it to work in terminal first, then I'd try making a Xojo shell.

  5. Robert W

    Nov 28 Western Canada

    I should mention that it works fine in Terminal if I put the latex markup text in a text file and then use that as input. I'd just like to avoid dealing with a file if I don't have to.

  6. Kem T

    Nov 28 Pre-Release Testers, Xojo Pro, XDC Speakers Connecticut

    Will it take input from StdIn or perhaps as a command line parameter?

  7. Norman P

    Nov 28 Pre-Release Testers, Xojo Pro Answer under a bus

    or a here file

  8. Robert W

    Nov 28 Western Canada

    I didn't try stdin, but I just tried the Here File method using the
    <<< 'myMarkupCodeText'
    format, and it works in Terminal (bash). Now, I'll have to find out if it will work in a Xojo shell. I remember there's been quite a bit of discussion here on the forum about the differences between running things in terminal and a Shell object. I'll see what happens.

    My biggest concern had been that the default output directory is the same as the input file. So, I wasn't sure where it would put the output if there was no input file directory. It just puts the output in the user's root directory. I think I can probably add some parameters to the command line to put the output in a more suitable place.

    Anyway, so far so good. I'll report back later with the Shell results. Thanks for the suggestions.

  9. Kem T

    Nov 28 Pre-Release Testers, Xojo Pro, XDC Speakers Connecticut

    Preceding the command with cd works too.

  10. Robert W

    Nov 28 Western Canada

    Yeah, I figured the output destination shouldn't be too difficult.

    If this gets to be too easy, I have ways of making it more difficult. For example, it would be even nicer if I could avoid creating the output file as well, and just pipe the output into an http stream, and display it in an html viewer. :)

  11. Robert W

    Nov 29 Western Canada

    It didn't take much effort to get it working as a Xojo shell. The only difference between it and the Terminal app was that I had to specify the path for the pdflatex command. As Kem suggested, I started with a CD command to set the directory to SpecialFolder.ApplicationData.MyAppStuff. Then the output file goes there when pdflatex is run. So, I just had to add some code to load the output file into my app.

    Unfortunately, since pdflatex creates a pdf file, the only way to display it is to use an html viewer control, which isn't very good for this kind of thing. I'll have to see what other tools are in the MacTex package. I'm hoping there's something that will produce a simple graphic file.

  12. last week

    Robert W

    Dec 1 Western Canada

    With a bit more experimentation, I found that pdflatex has a dvi format file output option, and there is also a utility dvipng (also part of the TexLive distribution) that converts dvi files to png graphics files. So, I've now got the shell generating and importing the png from LaTeX markup code. The png file is much easier to deal with.

    Function LaTeX2pic(mTxt As String, res As Integer) as Picture
      'Convert a LaTeX format math formula string to a picture
      'mTxt is the LaTeX text
      'res is the required picture resolution in dpi
      'Uses a shell to call pdflatex and dvipng commands
      'which are part of the MacTex/TexLive distributions
      '
      'cmdPath is the path to the directory of the Tex commands.
      'Depending on which Tex distribution and which hardware/OS platform
      'is used this line may need to be changed.
      dim cmdPath As String = "/usr/local/texlive/2018/bin/x86_64-darwin/"
      dim f As FolderItem = SpecialFolder.ApplicationData.Child("MyAppStuff")
      if not f.Exists then
        'Create Application Support/MyAppStuff folder if it doesn't already exist.
        f.CreateAsFolder
      end if
      dim sPath As String = f.NativePath
      Dim My_Shell As New Shell
      My_Shell.TimeOut=-1
      Dim theShellCode As String = "cd """+sPath+""""+EndOfLine
      theShellCode = theShellCode + cmdPath+"pdflatex -output-format=dvi <<<'"
      theShellCode = theShellCode + "\documentclass[12pt]{slides}"+EndOfLine
      theShellCode = theShellCode + "\usepackage{geometry}"+EndOfLine
      theShellCode = theShellCode + "\usepackage{lingmacros}"+EndOfLine
      theShellCode = theShellCode + "\usepackage{tree-dvips}"+EndOfLine
      theShellCode = theShellCode + "\usepackage[usenames]{color} %used for font color"+EndOfLine
      theShellCode = theShellCode + "\usepackage{amssymb} %maths"+EndOfLine
      theShellCode = theShellCode + "\usepackage{amsmath} %maths"+EndOfLine
      theShellCode = theShellCode + "\usepackage[utf8]{inputenc} %useful to type directly diacritic characters"+EndOfLine
      theShellCode = theShellCode + "\geometry{papersize={8.5in,1.5in}}"+EndOfLine
      theShellCode = theShellCode + "\begin{document}"+EndOfLine
      'Insert latex math code here. Warning: It must not contain any single quote characters.
      theShellCode = theShellCode + mTxt+EndOfLine
      'End of math code
      theShellCode = theShellCode + "\end{document}'"+EndOfLine
      theShellCode = theShellCode + cmdPath+"dvipng -bg Transparent -D "+str(res)+" texput.dvi"+EndOfLine
      My_Shell.Execute theShellCode
      'If everything went according to plan, there should be a png file in the app's app support folder.
      dim picFile As FolderItem = f.Child("texput1.png") 'default png file name
      If picFile <> Nil Then
        Dim pic As Picture
        pic = Picture.Open(picFile)
        'Optionally, place the picture directly in the window with either of the following commands uncommented:
        'ImageWell1.Image = pic
        'Canvas1.Backdrop = pic
        Return pic
      Else
        'Error - Couldn't open picFile
        return nil
      End If
    End Function

    I'm sure there's probably a way to set up the command search path so that it's not necessary to use the full path to the commands, but I'm not familiar enough with Unix to know how to do this.

or Sign Up to reply!