zopencommunity / bashport

The Bourne Again shell
Apache License 2.0
8 stars 3 forks source link

A question about bash pipe(|) #72

Open peiqingyu opened 5 months ago

peiqingyu commented 5 months ago

I have an input file which is untagged and its content is ascii characters "abc".

$ echo abc >input
$ chtag -r input
$ chtag -p input
 - untagged    T=off input

And I have a Go program named main which reads data from stdin and prints the data in hex. $ cat input | main input is: 2fefbfbdc48e

I expected got "6162630a" which is "abc\n" in hex. It seems bash does a conversation from 819 to 1047. On my test system, _BPXK_AUTOCVT is set to "On". I am confused about the behavior. Any thought? If the input file is tagged with 819 I got the expected output. $ chtag -p input 6162630a

IgorTodorovskiIBM commented 5 months ago

Bash is compiled as an ASCII program, so in order to work with ebcdic files, you need to tag it appropriately.

If you tag your file as EBCDIC, using chtag -tc 1047 input do you get the expected result?

The other option is to set this environment variable:

  export     __UNTAGGED_READ_MODE=ASCII
              always convert data from CCSID 1047 to CCSID 819
peiqingyu commented 5 months ago

The input is an ASCII file which is untagged and I expect to get its ASCII content in my Go program. In our actual case, the input file is a tarball and it is untagged. I expect the Go program to read the tarball in stdin and then extract the content correctly. I tested the following scenarios with bash: $ cat tarball | go-program --- doesn't work $ go-program < <(cat tarball) --- doesn't work $ go-program <tarball --- works well Only the third redirection method works for my case. Why the other two methods do not work? Is it possible to make them work? It seems the tarball is converted from 1047 to 819 by bash for the first two methods. Thanks.